在大數(shù)據(jù)場(chǎng)景中销凑,大量數(shù)據(jù)是以文件形式保存的丛晌,典型代表是行為日志數(shù)據(jù)(用戶搜索日志、購(gòu)買日志闻鉴、點(diǎn)擊日志,以及機(jī)器操作日志等)茂洒。
這些文件形式的數(shù)據(jù)具有價(jià)值高孟岛、數(shù)據(jù)大、流式產(chǎn)生等特點(diǎn)督勺,需要一個(gè)分布式文件系統(tǒng)存儲(chǔ)它們渠羞,該文件系統(tǒng)應(yīng)具有良好的容錯(cuò)性、擴(kuò)展性和易用的API智哀,而HDFS(Hadoop Distributed File System)便是一個(gè)較為理想的解決方案次询。
HDFS
HDFS是一種塊級(jí)別的分布式文件系統(tǒng)。
塊級(jí)別的分布式文件系統(tǒng)系統(tǒng)核心思想是將文件分成等大的數(shù)據(jù)塊瓷叫,并以數(shù)據(jù)塊為單位存儲(chǔ)到不同節(jié)點(diǎn)上屯吊,進(jìn)而解決文件級(jí)別的分布式系統(tǒng)存在的負(fù)載均衡和并行處理問(wèn)題。
HDFS采用了主從架構(gòu)摹菠,如下圖所示:
主節(jié)點(diǎn)被稱為NameNode盒卸,只有一個(gè),管理元信息和所有從節(jié)點(diǎn)次氨;
從節(jié)點(diǎn)稱為DataNode蔽介,通常存在多個(gè),存儲(chǔ)實(shí)際的數(shù)據(jù)塊煮寡。
HDFS是一種塊級(jí)別的分布式文件系統(tǒng)虹蓄。
塊級(jí)別的分布式文件系統(tǒng)系統(tǒng)核心思想是將文件分成等大的數(shù)據(jù)塊,并以數(shù)據(jù)塊為單位存儲(chǔ)到不同節(jié)點(diǎn)上幸撕,進(jìn)而解決文件級(jí)別的分布式系統(tǒng)存在的負(fù)載均衡和并行處理問(wèn)題薇组。
HDFS采用了主從架構(gòu),如下圖所示:
主節(jié)點(diǎn)被稱為NameNode坐儿,只有一個(gè)体箕,管理元信息和所有從節(jié)點(diǎn)专钉;
從節(jié)點(diǎn)稱為DataNode,通常存在多個(gè)累铅,存儲(chǔ)實(shí)際的數(shù)據(jù)塊跃须。
1. NameNode
NameNode是HDFS集群管理者,負(fù)責(zé)管理文件系統(tǒng)元信息和所有DataNode娃兽。
1.管理元信息:NameNode維護(hù)著整個(gè)文件系統(tǒng)的目錄樹菇民,各個(gè)文件的數(shù)據(jù)塊信息等。
2.管理DataNode:DataNode周期性向NameNode匯報(bào)心跳以表明自己活著投储,一旦NameNode發(fā)現(xiàn)某個(gè)DataNode出現(xiàn)故障第练,會(huì)在其他存活DataNode上重構(gòu)丟失的數(shù)據(jù)塊。
一個(gè)HDFS集群中只存在一個(gè)對(duì)外服務(wù)的NameNode玛荞,稱為Active NameNode娇掏,
為了防止單個(gè)NameNode出現(xiàn)故障后導(dǎo)致整個(gè)集群不可用,用戶可啟動(dòng)一個(gè)備用NameNode勋眯,稱為Standby NameNode婴梧,為了實(shí)現(xiàn)NameNode HA(High Availability,高可用)客蹋,需解決好兩者的切換和狀態(tài)同步問(wèn)題塞蹭。
1.主/備切換:HDFS提供了手動(dòng)方式和自動(dòng)方式完成主備NameNode切換。
1)手動(dòng)方式是通過(guò)命令顯式修改NameNode角色完成的讶坯,通常用于NameNode滾動(dòng)升級(jí)(滾動(dòng)發(fā)布:一般是取出一個(gè)或者多個(gè)服務(wù)器停止服務(wù)番电,執(zhí)行更新,并重新將其投入使用辆琅。周而復(fù)始漱办,直到集群中所有的實(shí)例都更新成新版本);
2)自動(dòng)模式是通過(guò)ZooKeeper實(shí)現(xiàn)的婉烟,可在主NameNode不可用時(shí)洼冻,自動(dòng)將備用NameNode提升為主NameNode,以保證HDFS不間斷對(duì)外提供服務(wù)隅很。
2.狀態(tài)同步:主/備NameNode并不是通過(guò)強(qiáng)一致協(xié)議保證狀態(tài)一致的撞牢,而是通過(guò)第三方的共享存儲(chǔ)系統(tǒng)。
1)主NameNode將EditLog(修改日志叔营,比如創(chuàng)建和修改文件)寫入共享存儲(chǔ)系統(tǒng)屋彪,備用NameNode則從共享存儲(chǔ)系統(tǒng)中讀取這些修改日志,并重新執(zhí)行這些操作绒尊,以保證與主NameNode的內(nèi)存信息一致畜挥。
2)目前HDFS支持兩種共享存儲(chǔ)系統(tǒng):NFS(Network File System)和QJM(Quorum Journal Manager)QJM能夠構(gòu)建在普通商用機(jī)器之上,比NFS更加廉價(jià)婴谱,因此受眾更廣蟹但。
2. DataNode
DataNode存儲(chǔ)實(shí)際的數(shù)據(jù)塊躯泰,并周期性通過(guò)心跳向NameNode匯報(bào)自己的狀態(tài)信息。
3. Client
用戶通過(guò)客戶端與NameNode和DataNode交互华糖,完成HDFS管理(比如服務(wù)啟動(dòng)與停止)和數(shù)據(jù)讀寫等操作麦向。
此外,文件的分塊操作也是在客戶端完成的客叉。當(dāng)向HDFS寫入文件時(shí)诵竭,客戶端首先將文件切分成等大的數(shù)據(jù)塊(默認(rèn)一個(gè)數(shù)據(jù)塊大小為128MB),之后從NameNode上領(lǐng)取三個(gè)DataNode地址兼搏,并在它們之間建立數(shù)據(jù)流水線卵慰,進(jìn)而將數(shù)據(jù)塊流式寫入這些節(jié)點(diǎn)。
隨著數(shù)據(jù)塊和訪問(wèn)量的增加佛呻,單個(gè)NameNode會(huì)成為制約HDFS擴(kuò)展性的瓶頸裳朋,為了解決該問(wèn)題,HDFS提供了NameNode Federation機(jī)制吓著,允許一個(gè)集群中存在多個(gè)對(duì)外服務(wù)的NameNode鲤嫡,它們各自管理目錄樹的一部分(對(duì)目錄水平分片),如圖6-4所示夜矗。需要注意的是泛范,在NameNode Federation中让虐,每個(gè)主NameNode均存在單點(diǎn)故障問(wèn)題紊撕,需為之分配一個(gè)備用NameNode。
HDFS關(guān)鍵技術(shù)
1.容錯(cuò)性設(shè)計(jì)
? NameNode故障:NameNode內(nèi)存中記錄了文件系統(tǒng)的元信息赡突,這些元信息一旦丟失对扶,將導(dǎo)致整個(gè)文件系統(tǒng)數(shù)據(jù)不可用。HDFS允許為每個(gè)Active NameNode分配一個(gè)Standby NameNode惭缰,以防止單個(gè)NameNode宕機(jī)后導(dǎo)致元信息丟失和整個(gè)集群不可訪問(wèn)浪南。
? DataNode故障:每個(gè)DataNode保存了實(shí)際的數(shù)據(jù)塊,這些數(shù)據(jù)塊在其他DataNode上存在相同的副本漱受。DataNode能通過(guò)心跳機(jī)制向NameNode匯報(bào)狀態(tài)信息络凿,當(dāng)某個(gè)DataNode宕機(jī)后,NameNode可在其他節(jié)點(diǎn)上重構(gòu)該DataNode上的數(shù)據(jù)塊昂羡,以保證每個(gè)文件的副本數(shù)在正常水平線上絮记。
? 數(shù)據(jù)塊損壞:DataNode保存數(shù)據(jù)塊時(shí),會(huì)同時(shí)生成一個(gè)校驗(yàn)碼虐先。當(dāng)存取數(shù)據(jù)塊時(shí)怨愤,如果發(fā)現(xiàn)校驗(yàn)碼不一致,則認(rèn)為該數(shù)據(jù)塊已經(jīng)損壞蛹批,NameNode會(huì)通過(guò)其他節(jié)點(diǎn)上的正常副本重構(gòu)受損的數(shù)據(jù)塊撰洗。
2.副本放置策略
? 客戶端與DataNode同節(jié)點(diǎn)篮愉。這是一種常見的場(chǎng)景:上層計(jì)算框架處理HDFS數(shù)據(jù)時(shí),每個(gè)任務(wù)實(shí)際上就是一個(gè)客戶端差导,它們運(yùn)行在與DataNode相同的計(jì)算節(jié)點(diǎn)上(HDFS和YARN同節(jié)點(diǎn)部署)试躏。在這種情況下,三副本放置策略如下:第一個(gè)副本寫到同節(jié)點(diǎn)的DataNode上柿汛,另外兩個(gè)副本寫到另一個(gè)相同機(jī)架的不同DataNode上冗酿;
? 客戶端與DataNode不同節(jié)點(diǎn)。當(dāng)HDFS之外的應(yīng)用程序向HDFS寫數(shù)據(jù)時(shí)络断,通常會(huì)出現(xiàn)這種情況裁替,典型的場(chǎng)景有Flume Sink,用戶通過(guò)獨(dú)立客戶端shell命令行將文件上傳到HDFS等貌笨。在這種情況下弱判,HDFS會(huì)隨機(jī)選擇一個(gè)DataNode作為第一個(gè)副本放置節(jié)點(diǎn),其他兩個(gè)副本寫到另一個(gè)相同機(jī)架的不同DataNode上锥惋。
3.異構(gòu)存儲(chǔ)介質(zhì)
HDFS支持多種常用存儲(chǔ)類型昌腰。異構(gòu)存儲(chǔ)介質(zhì)的引入,使得HDFS變成了一個(gè)提供混合存儲(chǔ)方式的文件系統(tǒng)膀跌,用戶可以根據(jù)數(shù)據(jù)特點(diǎn)遭商,選擇合適的存儲(chǔ)介質(zhì)滿足你應(yīng)用需求。
? ARCHIVE:高存儲(chǔ)密度但耗電較少的存儲(chǔ)介質(zhì)捅伤,通常用來(lái)存儲(chǔ)冷數(shù)據(jù)劫流。
? DISK:磁盤介質(zhì),這是HDFS默認(rèn)的存儲(chǔ)介質(zhì)丛忆。
? SSD:固態(tài)硬盤祠汇,是一種新型存儲(chǔ)介質(zhì),目前被不少互聯(lián)網(wǎng)公司使用熄诡。
? RAM_DISK:數(shù)據(jù)被寫入內(nèi)存中可很,同時(shí)會(huì)往該存儲(chǔ)介質(zhì)中再(異步)寫一份。
4. 集中式緩存管理
HDFS允許用戶將一部分目錄或文件緩存在off-heap內(nèi)存中凰浮,以加速對(duì)這些數(shù)據(jù)的訪問(wèn)效率我抠,該機(jī)制被稱為集中式緩存管理。
HDFS提供了API和命令行兩種方式袜茧,讓用戶管理集中式緩存系統(tǒng)中的文件和目錄菜拓,用戶可以根據(jù)需要將一個(gè)文件增加到緩存中,或從緩存中移除惫周。
數(shù)據(jù)收集組件
1. Flume
Flume提供了HDFS Sink尘惧,能夠?qū)⑹占降臄?shù)據(jù)直接寫入HDFS中,且自帶了靈活的配置參數(shù)递递、支持壓縮喷橙、按時(shí)或按大小切分文件等啥么。
2. Sqoop
Sqoop允許用戶指定數(shù)據(jù)寫入HDFS的目錄、文件格式(支持Text和SequenceFile兩種格式)贰逾、壓縮方式(支持LZO, Snappy等主流壓縮編碼)等悬荣。
SequenceFile:Hadoop用來(lái)存儲(chǔ)二進(jìn)制形式的[Key,Value]對(duì)而設(shè)計(jì)的一種平面文件(Flat file)。
小結(jié)
HDFS是一個(gè)分布式文件系統(tǒng)疙剑,具有良好的擴(kuò)展性氯迂、容錯(cuò)性以及易用的API。
它的核心思想是將文件切分成等大的數(shù)據(jù)塊言缤,以多副本的形式存儲(chǔ)到多個(gè)節(jié)點(diǎn)上嚼蚀。
HDFS采用了經(jīng)典的主從軟件架構(gòu),其中主服務(wù)被稱為NameNode管挟,管理文件系統(tǒng)的元信息轿曙,而從服務(wù)被稱為DataNode,存儲(chǔ)實(shí)際的數(shù)據(jù)塊僻孝,
DataNode與NameNode維護(hù)了周期性的心跳导帝,為了防止NameNode出現(xiàn)單點(diǎn)故障,HDFS允許一個(gè)集群中存在主備NameNode穿铆,并通過(guò)ZooKeeper完成Active NameNode的選舉工作您单。
HDFS提供了豐富的訪問(wèn)方式,用戶可以通過(guò)HDFS shell, HDFS API荞雏,數(shù)據(jù)收集組件以及計(jì)算框架等存取HDFS上的文件虐秦。