1. HDFS優(yōu)缺點(diǎn)
1.1 優(yōu)點(diǎn)
1.1.1 高容錯(cuò)性
可以由數(shù)百或數(shù)千個(gè)服務(wù)器機(jī)器組成反浓,每個(gè)服務(wù)器機(jī)器存儲(chǔ)文件系統(tǒng)數(shù)據(jù)的一部分;
數(shù)據(jù)自動(dòng)保存多個(gè)副本南窗;
副本丟失后檢測(cè)故障快速揍很,自動(dòng)恢復(fù)。
1.1.2 適合批處理
移動(dòng)計(jì)算而非數(shù)據(jù)万伤;
數(shù)據(jù)位置暴露給計(jì)算框架窒悔;
數(shù)據(jù)訪問(wèn)的高吞吐量;
運(yùn)行的應(yīng)用程序?qū)ζ鋽?shù)據(jù)集進(jìn)行流式訪問(wèn)敌买。
1.1.3 適合大數(shù)據(jù)處理
典型文件大小為千兆字節(jié)到太字節(jié)简珠;
支持單個(gè)實(shí)例中的數(shù)千萬(wàn)個(gè)文件;
10K+節(jié)點(diǎn)虹钮。
1.1.4 可構(gòu)建在廉價(jià)的機(jī)器上
通過(guò)多副本提高可靠性聋庵;
提供了容錯(cuò)與恢復(fù)機(jī)制膘融。
1.1.5 跨異構(gòu)硬件和軟件平臺(tái)的可移植性強(qiáng)
輕松地從一個(gè)平臺(tái)移植到另一個(gè)平臺(tái)。
1.1.6 簡(jiǎn)單一致性模型
應(yīng)用程序需要一次寫(xiě)入多次讀取文件的訪問(wèn)模型祭玉;
除了追加和截?cái)嘀庋跤常恍枰囊褎?chuàng)建,寫(xiě)入和關(guān)閉的文件攘宙;
簡(jiǎn)化了數(shù)據(jù)一致性問(wèn)題屯耸,并實(shí)現(xiàn)了高吞吐量數(shù)據(jù)訪問(wèn);
高度可配置蹭劈,具有非常適合于許多安裝的默認(rèn)配置疗绣。大多數(shù)時(shí)候,只需要為非常大的集群調(diào)整配置铺韧。
1.2 缺點(diǎn)
1.2.1 不適合低延遲的數(shù)據(jù)訪問(wèn)
HDFS設(shè)計(jì)更多的是批處理多矮,而不是用戶交互使用。重點(diǎn)在于數(shù)據(jù)訪問(wèn)的高吞吐量哈打,而不是數(shù)據(jù)訪問(wèn)的低延遲塔逃。
1.2.2 不適合小文件存取
占用NameNode大量?jī)?nèi)存;
尋道時(shí)間超過(guò)讀取時(shí)間料仗。
1.2.3 無(wú)法并發(fā)寫(xiě)入湾盗、文件隨即修改
一個(gè)文件只能有一個(gè)寫(xiě)者;
僅支持追加和截?cái)唷?/p>
2. ?基本組成
2.1 Namenode
2.1.1 接受客戶端的讀寫(xiě)服務(wù)
執(zhí)行文件系統(tǒng)命名空間操作立轧,如打開(kāi)格粪,關(guān)閉和重命名文件和目錄。
2.1.2 管理文件系統(tǒng)命名空間
記錄對(duì)文件系統(tǒng)命名空間或其屬性的任何更改氛改。
2.1.3 metadata組成
Metadata是存儲(chǔ)在Namenode上的元數(shù)據(jù)信息帐萎,它存儲(chǔ)到磁盤(pán)的文件名為:fsimage。并且有個(gè)叫edits的文件記錄對(duì)metadata的操作日志胜卤〗迹總體來(lái)說(shuō),fsimage與edits文件記錄了Metadata中的權(quán)限信息和文件系統(tǒng)目錄樹(shù)葛躏、文件包含哪些塊澈段、確定塊到DataNode的映射、Block存放在哪些DataNode上(由DataNode啟動(dòng)時(shí)上報(bào))舰攒。
NameNode將這些信息加載到內(nèi)存并進(jìn)行拼裝均蜜,就成為了一個(gè)完整的元數(shù)據(jù)信息。
2.1.4 文件系統(tǒng)命名空間
HDFS支持傳統(tǒng)的分層文件組織芒率。用戶或應(yīng)用程序可以在這些目錄中創(chuàng)建目錄和存儲(chǔ)文件囤耳。文件系統(tǒng)命名空間層次結(jié)構(gòu)與大多數(shù)其他現(xiàn)有文件系統(tǒng)類(lèi)似:可以創(chuàng)建和刪除文件,將文件從一個(gè)目錄移動(dòng)到另一個(gè)目錄,或重命名文件充择。HDFS支持用戶配額和訪問(wèn)權(quán)限德玫。但不支持硬鏈接或軟鏈接。
NameNode維護(hù)文件系統(tǒng)命名空間椎麦。對(duì)文件系統(tǒng)命名空間或其屬性的任何更改由NameNode記錄宰僧。應(yīng)用程序可以指定應(yīng)由HDFS維護(hù)的文件的副本數(shù)。文件的副本數(shù)稱(chēng)為該文件的復(fù)制因子观挎。此信息由NameNode存儲(chǔ)琴儿。
2.1.5 文件系統(tǒng)元數(shù)據(jù)的持久性
NameNode的metadata信息在啟動(dòng)后會(huì)加載到內(nèi)存,由于加載到內(nèi)存的數(shù)據(jù)很不安全嘁捷,斷電后就沒(méi)有了造成,因此必須對(duì)內(nèi)存中存放的信息做持久化處理。
Namenode上保存著HDFS的命名空間雄嚣。對(duì)于任何對(duì)文件系統(tǒng)元數(shù)據(jù)產(chǎn)生修改的操作晒屎,Namenode都會(huì)使用一種稱(chēng)為Edits的事務(wù)日志記錄下來(lái)。例如缓升,在HDFS中創(chuàng)建一個(gè)文件鼓鲁,Namenode就會(huì)在Edits中插入一條記錄來(lái)表示;同樣地港谊,修改文件的副本系數(shù)也將往Edits插入一條記錄骇吭。Namenode在本地操作系統(tǒng)的文件系統(tǒng)中存儲(chǔ)這個(gè)Edits。整個(gè)文件系統(tǒng)的命名空間歧寺,包括數(shù)據(jù)塊到文件的映射燥狰、文件的屬性等,都存儲(chǔ)在一個(gè)稱(chēng)為FsImage的文件中成福,這個(gè)文件也是放在Namenode所在的本地文件系統(tǒng)上碾局。
Namenode在內(nèi)存中保存著整個(gè)文件系統(tǒng)的命名空間和文件數(shù)據(jù)塊映射(Blockmap)的映像荆残。這個(gè)關(guān)鍵的元數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)得很緊湊奴艾,因而一個(gè)有4G內(nèi)存的Namenode足夠支撐大量的文件和目錄。當(dāng)Namenode啟動(dòng)時(shí)内斯,它從硬盤(pán)中讀取Edits和FsImage蕴潦,將所有Edits中的事務(wù)作用在內(nèi)存中的FsImage上,并將這個(gè)新版本的FsImage從內(nèi)存中保存到本地磁盤(pán)上俘闯,然后刪除舊的Edits潭苞,因?yàn)檫@個(gè)舊的Edits的事務(wù)都已經(jīng)作用在FsImage上了。這個(gè)過(guò)程稱(chēng)為一個(gè)檢查點(diǎn)(checkpoint)真朗。
Datanode將HDFS數(shù)據(jù)以文件的形式存儲(chǔ)在本地的文件系統(tǒng)中此疹,它并不知道有關(guān)HDFS文件的信息。它把每個(gè)HDFS數(shù)據(jù)塊存儲(chǔ)在本地文件系統(tǒng)的一個(gè)單獨(dú)的文件中。Datanode并不在同一個(gè)目錄創(chuàng)建所有的文件蝗碎,實(shí)際上湖笨,它用試探的方法來(lái)確定每個(gè)目錄的最佳文件數(shù)目,并且在適當(dāng)?shù)臅r(shí)候創(chuàng)建子目錄蹦骑。在同一個(gè)目錄中創(chuàng)建所有的本地文件并不是最優(yōu)的選擇慈省,這是因?yàn)楸镜匚募到y(tǒng)可能無(wú)法高效地在單個(gè)目錄中支持大量的文件。當(dāng)一個(gè)Datanode啟動(dòng)時(shí)眠菇,它會(huì)掃描本地文件系統(tǒng)边败,產(chǎn)生一個(gè)這些本地文件對(duì)應(yīng)的所有HDFS數(shù)據(jù)塊的列表,然后作為報(bào)告發(fā)送到Namenode捎废,這個(gè)報(bào)告就是塊狀態(tài)報(bào)告笑窜。
2.2 SecondaryNameNode
它不是NameNode的備份,但可以作為NameNode的備份缕坎,當(dāng)因?yàn)閿嚯娀蚍?wù)器損壞的情況怖侦,可以用SecondNameNode中已合并的fsimage文件作為備份文件恢復(fù)到NameNode上,但是很有可能丟失掉在合并過(guò)程中新生成的edits信息谜叹。因此不是完全的備份匾寝。
由于NameNode僅在啟動(dòng)期間合并fsimage和edits文件,因此在繁忙的群集上荷腊,edits日志文件可能會(huì)隨時(shí)間變得非常大艳悔。較大編輯文件的另一個(gè)副作用是下一次重新啟動(dòng)NameNode需要更長(zhǎng)時(shí)間。SecondNameNode的主要功能是幫助NameNode合并edits和fsimage文件女仰,從而減少NameNode啟動(dòng)時(shí)間猜年。
2.2.1 SNN執(zhí)行合并時(shí)機(jī)
根據(jù)配置文件配置的時(shí)間間隔fs.checkpoint.period默認(rèn)1小時(shí);
dfs.namenode.checkpoint.txns疾忍,默認(rèn)設(shè)置為1百萬(wàn)乔外,也就是Edits中的事務(wù)條數(shù)達(dá)到1百萬(wàn)就會(huì)觸發(fā)一次合并,即使未達(dá)到檢查點(diǎn)期間一罩。
2.2.2 SNN合并流程
首先生成一個(gè)名叫edits.new的文件用于記錄合并過(guò)程中產(chǎn)生的日志信息杨幼;
當(dāng)觸發(fā)到某一時(shí)機(jī)時(shí)(時(shí)間間隔達(dá)到1小時(shí)或Edits中的事務(wù)條數(shù)達(dá)到1百萬(wàn))時(shí)SecondaryNamenode將edits文件、與fsimage文件從NameNode上讀取到SecondNamenode上聂渊;
將edits文件與fsimage進(jìn)行合并操作差购,合并成一個(gè)fsimage.ckpt文件;
將生成的合并后的文件fsimage.ckpt文件轉(zhuǎn)換到NameNode上汉嗽;
將fsimage.ckpt在NameNode上變成fsimage文件替換NameNode上原有的fsimage文件欲逃,并將edits.new文件上變成edits文件替換NameNode上原有的edits文件。
SNN在hadoop2.x及以上版本在非高可用狀態(tài)時(shí)還存在饼暑,但是在hadoop2.x及以上版本高可用狀態(tài)下SNN就不存在了稳析,在hadoop2.x及以上版本在高可用狀態(tài)下洗做,處于standby狀態(tài)的NameNode來(lái)做合并操作。
2.3 DataNode
管理附加到它們運(yùn)行的節(jié)點(diǎn)的存儲(chǔ)彰居,并允許用戶數(shù)據(jù)存儲(chǔ)在文件中竭望;
在內(nèi)部,文件被分割成一個(gè)或多個(gè)塊(Block)裕菠,并且這些塊被存儲(chǔ)在一組DataNode中咬清;
負(fù)責(zé)提供來(lái)自文件系統(tǒng)客戶端的讀取和寫(xiě)入請(qǐng)求;
執(zhí)行塊創(chuàng)建奴潘,刪除旧烧;
啟動(dòng)DN進(jìn)程的時(shí)候會(huì)向NN匯報(bào)Block信息;
通過(guò)向NN發(fā)送心跳保持與其聯(lián)系(3秒一次)画髓,如果NN10分鐘沒(méi)有收到DN的心跳掘剪,則認(rèn)為DN已經(jīng)丟失,并且復(fù)制其上的Block到其他的DN上奈虾。
2.3.1 HDFS存儲(chǔ)單元(block)
2.3.1.1文件被切分成固定大小的數(shù)據(jù)塊
默認(rèn)數(shù)據(jù)塊大小為64MB(hadoop1.x)夺谁、128MB(hadoop2.x)、256MB(hadoop3.x)肉微,可配置匾鸥;
若文件大小不到一個(gè)塊大小,則單獨(dú)存成一個(gè)block碉纳,block塊是一個(gè)邏輯意義上的概念勿负。文件大小是多少,就占多少空間劳曹。
2.3.1.2 一個(gè)文件存儲(chǔ)方式
按大小被切分成不同的block奴愉,存儲(chǔ)到不同的節(jié)點(diǎn)上;
默認(rèn)情況下铁孵,每個(gè)block都有3個(gè)副本锭硼;
block大小與副本數(shù)通過(guò)client端上傳文件時(shí)設(shè)置,文件上傳成功后副本數(shù)可以變更蜕劝,block size不可變更檀头。
2.3.1.3 設(shè)計(jì)思想
將大文件拆分成256MB的block塊,每個(gè)block塊分別隨機(jī)存放在不同的節(jié)點(diǎn)上熙宇,從而避免了數(shù)據(jù)傾斜的問(wèn)題鳖擒,但是在開(kāi)發(fā)過(guò)程中溉浙,如果算法烫止、程序?qū)懙牟缓茫瑯右矔?huì)出現(xiàn)數(shù)據(jù)傾斜的問(wèn)題戳稽。
2.3.2 數(shù)據(jù)復(fù)制
2.3.2.1 數(shù)據(jù)復(fù)制概述
HDFS被設(shè)計(jì)成能夠在一個(gè)大集群中跨機(jī)器可靠地存儲(chǔ)超大文件馆蠕。它將每個(gè)文件存儲(chǔ)成一系列的數(shù)據(jù)塊期升,除了最后一個(gè),所有的數(shù)據(jù)塊都是同樣大小的互躬。為了容錯(cuò)播赁,文件的所有數(shù)據(jù)塊都會(huì)有副本。每個(gè)文件的數(shù)據(jù)塊大小和副本系數(shù)都是可配置的吼渡。應(yīng)用程序可以指定某個(gè)文件的副本數(shù)目容为。副本系數(shù)可以在文件創(chuàng)建的時(shí)候指定,也可以在之后改變寺酪。HDFS中的文件都是一次性寫(xiě)入的坎背,并且嚴(yán)格要求在任何時(shí)候只能有一個(gè)寫(xiě)入者。
Namenode全權(quán)管理數(shù)據(jù)塊的復(fù)制寄雀,它周期性地從集群中的每個(gè)Datanode接收心跳信號(hào)和塊狀態(tài)報(bào)告(Blockreport)得滤。接收到心跳信號(hào)意味著該Datanode節(jié)點(diǎn)工作正常。塊狀態(tài)報(bào)告包含了一個(gè)該Datanode上所有數(shù)據(jù)塊的列表盒犹。
2.3.2.2 Block的副本放置策略
副本的存放是HDFS可靠性和性能的關(guān)鍵懂更。優(yōu)化的副本存放策略是HDFS區(qū)分于其他大部分分布式文件系統(tǒng)的重要特性。這種特性需要做大量的調(diào)優(yōu)急膀,并需要經(jīng)驗(yàn)的積累沮协。HDFS采用一種稱(chēng)為機(jī)架感知(rack-aware)的策略來(lái)改進(jìn)數(shù)據(jù)的可靠性、可用性和網(wǎng)絡(luò)帶寬的利用率卓嫂。目前實(shí)現(xiàn)的副本存放策略只是在這個(gè)方向上的第一步皂股。實(shí)現(xiàn)這個(gè)策略的短期目標(biāo)是驗(yàn)證它在生產(chǎn)環(huán)境下的有效性,觀察它的行為命黔,為實(shí)現(xiàn)更先進(jìn)的策略打下測(cè)試和研究的基礎(chǔ)呜呐。
大型HDFS實(shí)例一般運(yùn)行在跨越多個(gè)機(jī)架的計(jì)算機(jī)組成的集群上,不同機(jī)架上的兩臺(tái)機(jī)器之間的通訊需要經(jīng)過(guò)交換機(jī)悍募。在大多數(shù)情況下蘑辑,同一個(gè)機(jī)架內(nèi)的兩臺(tái)機(jī)器間的帶寬會(huì)比不同機(jī)架的兩臺(tái)機(jī)器間的帶寬大。
通過(guò)一個(gè)機(jī)架感知的過(guò)程坠宴,Namenode可以確定每個(gè)Datanode所屬的機(jī)架id洋魂。一個(gè)簡(jiǎn)單但沒(méi)有優(yōu)化的策略就是將副本存放在不同的機(jī)架上。這樣可以有效防止當(dāng)整個(gè)機(jī)架失效時(shí)數(shù)據(jù)的丟失喜鼓,并且允許讀數(shù)據(jù)的時(shí)候充分利用多個(gè)機(jī)架的帶寬副砍。這種策略設(shè)置可以將副本均勻分布在集群中,有利于當(dāng)組件失效情況下的負(fù)載均衡庄岖。但是豁翎,因?yàn)檫@種策略的一個(gè)寫(xiě)操作需要傳輸數(shù)據(jù)塊到多個(gè)機(jī)架,這增加了寫(xiě)的代價(jià)隅忿。
在大多數(shù)情況下心剥,副本系數(shù)是3邦尊,HDFS的存放策略是將一個(gè)副本存放在本地機(jī)架的節(jié)點(diǎn)上,一個(gè)副本放在同一機(jī)架的另一個(gè)節(jié)點(diǎn)上优烧,最后一個(gè)副本放在不同機(jī)架的節(jié)點(diǎn)上蝉揍。這種策略減少了機(jī)架間的數(shù)據(jù)傳輸,這就提高了寫(xiě)操作的效率畦娄。機(jī)架的錯(cuò)誤遠(yuǎn)遠(yuǎn)比節(jié)點(diǎn)的錯(cuò)誤少又沾,所以這個(gè)策略不會(huì)影響到數(shù)據(jù)的可靠性和可用性。于此同時(shí)熙卡,因?yàn)閿?shù)據(jù)塊只放在兩個(gè)(不是三個(gè))不同的機(jī)架上捍掺,所以此策略減少了讀取數(shù)據(jù)時(shí)需要的網(wǎng)絡(luò)傳輸總帶寬。在這種策略下再膳,副本并不是均勻分布在不同的機(jī)架上挺勿。三分之一的副本在一個(gè)節(jié)點(diǎn)上,三分之二的副本在一個(gè)機(jī)架上喂柒,其他副本均勻分布在剩下的機(jī)架中不瓶,這一策略在不損害數(shù)據(jù)可靠性和讀取性能的情況下改進(jìn)了寫(xiě)的性能。
2.3.2.3 副本選擇
為了降低整體的帶寬消耗和讀取延時(shí)灾杰,HDFS會(huì)盡量讓讀取程序讀取離它最近的副本蚊丐。如果在讀取程序的同一個(gè)機(jī)架上有一個(gè)副本,那么就讀取該副本艳吠。如果一個(gè)HDFS集群跨越多個(gè)數(shù)據(jù)中心麦备,那么客戶端也將首先讀本地?cái)?shù)據(jù)中心的副本。
2.3.2.4 安全模式
NameNode在啟動(dòng)的時(shí)候會(huì)進(jìn)入一個(gè)稱(chēng)為安全模式的特殊狀態(tài)昭娩,它首先將映像文件(fsimage)載入內(nèi)存凛篙,并執(zhí)行編輯日志(edits)中的各項(xiàng)操作;
一旦在內(nèi)存中成功建立文件系統(tǒng)元數(shù)據(jù)映射栏渺,則創(chuàng)建一個(gè)新的fsimage文件(這個(gè)操作不需要SecondNameNode來(lái)做)與一個(gè)空的編輯日志呛梆;
此刻namenode運(yùn)行在安全模式,即namenode的文件系統(tǒng)對(duì)于客戶端來(lái)說(shuō)是只讀的磕诊,顯示目錄填物、顯示文件內(nèi)容等,寫(xiě)霎终、刪除滞磺、重命名都會(huì)失敗莱褒;
在此階段namenode搜集各個(gè)datanode的報(bào)告击困,當(dāng)數(shù)據(jù)塊達(dá)到最小副本數(shù)以上時(shí),會(huì)被認(rèn)為是“安全”的保礼,在一定比例的數(shù)據(jù)塊被認(rèn)為是安全的以后(可設(shè)置)沛励,再過(guò)若干時(shí)間,安全模式結(jié)束炮障;
當(dāng)檢測(cè)到副本數(shù)不足數(shù)據(jù)塊時(shí)目派,該塊會(huì)被復(fù)制,直到達(dá)到最小副本數(shù)胁赢,系統(tǒng)中數(shù)據(jù)塊的位置并不是由namenode維護(hù)的企蹭,而是以塊列表形式存儲(chǔ)在datanode中。