我們依然是先過(guò)一遍官方文檔:
引言
Hadoop分布式文件系統(tǒng)(HDFS)被設(shè)計(jì)成適合運(yùn)行在通用硬件(commodity hardware)上的分布式文件系統(tǒng)。它和現(xiàn)有的分布式文件系統(tǒng)有很多共同點(diǎn)。但同時(shí),它和其他的分布式文件系統(tǒng)的區(qū)別也是很明顯的。HDFS是一個(gè)高度容錯(cuò)性的系統(tǒng),適合部署在廉價(jià)的機(jī)器上。HDFS能提供高吞吐量的數(shù)據(jù)訪問(wèn),非常適合大規(guī)模數(shù)據(jù)集上的應(yīng)用。HDFS放寬了一部分POSIX約束,來(lái)實(shí)現(xiàn)流式讀取文件系統(tǒng)數(shù)據(jù)的目的。HDFS在最開始是作為Apache Nutch搜索引擎項(xiàng)目的基礎(chǔ)架構(gòu)而開發(fā)的。HDFS是Apache Hadoop Core項(xiàng)目的一部分。
硬件錯(cuò)誤
硬件錯(cuò)誤是常態(tài)而不是異常。HDFS可能由成百上千的服務(wù)器所構(gòu)成,每個(gè)服務(wù)器上存儲(chǔ)著文件系統(tǒng)的部分?jǐn)?shù)據(jù)。我們面對(duì)的現(xiàn)實(shí)是構(gòu)成系統(tǒng)的組件數(shù)目是巨大的,而且任一組件都有可能失效,這意味著總是有一部分HDFS的組件是不工作的。因此錯(cuò)誤檢測(cè)和快速、自動(dòng)的恢復(fù)是HDFS最核心的架構(gòu)目標(biāo)。
流式數(shù)據(jù)訪問(wèn)
運(yùn)行在HDFS上的應(yīng)用和普通的應(yīng)用不同,需要流式訪問(wèn)它們的數(shù)據(jù)集。HDFS的設(shè)計(jì)中更多的考慮到了數(shù)據(jù)批處理,而不是用戶交互處理。比之?dāng)?shù)據(jù)訪問(wèn)的低延遲問(wèn)題,更關(guān)鍵的在于數(shù)據(jù)訪問(wèn)的高吞吐量。POSIX標(biāo)準(zhǔn)設(shè)置的很多硬性約束對(duì)HDFS應(yīng)用系統(tǒng)不是必需的。為了提高數(shù)據(jù)的吞吐量,在一些關(guān)鍵方面對(duì)POSIX的語(yǔ)義做了一些修改。
大規(guī)模數(shù)據(jù)集
運(yùn)行在HDFS上的應(yīng)用具有很大的數(shù)據(jù)集。HDFS上的一個(gè)典型文件大小一般都在G字節(jié)至T字節(jié)。因此,HDFS被調(diào)節(jié)以支持大文件存儲(chǔ)。它應(yīng)該能提供整體上高的數(shù)據(jù)傳輸帶寬,能在一個(gè)集群里擴(kuò)展到數(shù)百個(gè)節(jié)點(diǎn)。一個(gè)單一的HDFS實(shí)例應(yīng)該能支撐數(shù)以千萬(wàn)計(jì)的文件。
簡(jiǎn)單的一致性模型
HDFS應(yīng)用需要一個(gè)“一次寫入多次讀取”的文件訪問(wèn)模型。一個(gè)文件經(jīng)過(guò)創(chuàng)建、寫入和關(guān)閉之后就不需要改變。這一假設(shè)簡(jiǎn)化了數(shù)據(jù)一致性問(wèn)題,并且使高吞吐量的數(shù)據(jù)訪問(wèn)成為可能。Map/Reduce應(yīng)用或者網(wǎng)絡(luò)爬蟲應(yīng)用都非常適合這個(gè)模型。目前還有計(jì)劃在將來(lái)擴(kuò)充這個(gè)模型,使之支持文件的附加寫操作。
“移動(dòng)計(jì)算比移動(dòng)數(shù)據(jù)更劃算”
一個(gè)應(yīng)用請(qǐng)求的計(jì)算,離它操作的數(shù)據(jù)越近就越高效,在數(shù)據(jù)達(dá)到海量級(jí)別的時(shí)候更是如此。因?yàn)檫@樣就能降低網(wǎng)絡(luò)阻塞的影響,提高系統(tǒng)數(shù)據(jù)的吞吐量。將計(jì)算移動(dòng)到數(shù)據(jù)附近,比之將數(shù)據(jù)移動(dòng)到應(yīng)用所在顯然更好。HDFS為應(yīng)用提供了將它們自己移動(dòng)到數(shù)據(jù)附近的接口。
異構(gòu)軟硬件平臺(tái)間的可移植性
HDFS在設(shè)計(jì)的時(shí)候就考慮到平臺(tái)的可移植性。這種特性方便了HDFS作為大規(guī)模數(shù)據(jù)應(yīng)用平臺(tái)的推廣。
Namenode 和 Datanode
HDFS采用master/slave架構(gòu)。一個(gè)HDFS集群是由一個(gè)Namenode和一定數(shù)目的Datanodes組成。Namenode是一個(gè)中心服務(wù)器,負(fù)責(zé)管理文件系統(tǒng)的名字空間(namespace)以及客戶端對(duì)文件的訪問(wèn)。集群中的Datanode一般是一個(gè)節(jié)點(diǎn)一個(gè),負(fù)責(zé)管理它所在節(jié)點(diǎn)上的存儲(chǔ)。HDFS暴露了文件系統(tǒng)的名字空間,用戶能夠以文件的形式在上面存儲(chǔ)數(shù)據(jù)。從內(nèi)部看,一個(gè)文件其實(shí)被分成一個(gè)或多個(gè)數(shù)據(jù)塊,這些塊存儲(chǔ)在一組Datanode上。Namenode執(zhí)行文件系統(tǒng)的名字空間操作,比如打開、關(guān)閉、重命名文件或目錄。它也負(fù)責(zé)確定數(shù)據(jù)塊到具體Datanode節(jié)點(diǎn)的映射。Datanode負(fù)責(zé)處理文件系統(tǒng)客戶端的讀寫請(qǐng)求。在Namenode的統(tǒng)一調(diào)度下進(jìn)行數(shù)據(jù)塊的創(chuàng)建、刪除和復(fù)制。
官方文檔還給出了圖片:

? 我在嘗試使用HDFS上傳文件的時(shí)候,估計(jì)跟大家的感覺一樣,像是在本地上傳到本地的感覺。
? 而實(shí)際上HDFS是將文件分成若干塊保存在不同的服務(wù)器的節(jié)點(diǎn)中,為了降低文件丟失造成的錯(cuò)誤,它會(huì)為每個(gè)小文件復(fù)制多個(gè)副本(默認(rèn)為三個(gè)),以此來(lái)實(shí)現(xiàn)多機(jī)器上的多用戶分享文件和存儲(chǔ)空間。
? 再來(lái)解釋一下上圖,詳細(xì)講解一下Namenode與Datanode。
Namenode
? 是有點(diǎn)類似于Linux的根目錄,管理數(shù)據(jù)塊映射、處理客戶端的讀寫請(qǐng)求、配置副本策略、管理HDFS的名稱空間。
作用:
- Namenode起一個(gè)統(tǒng)領(lǐng)的作用,用戶通過(guò)namenode來(lái)實(shí)現(xiàn)對(duì)其他數(shù)據(jù)的訪問(wèn)和操作,類似于root根目錄的感覺。
- Namenode內(nèi)存中儲(chǔ)存的是:fsimage(元數(shù)據(jù)[1]鏡像文件) + edits(元數(shù)據(jù)[1]的操作日志) 【此兩個(gè)文件也是核心文件】
- Namenode中僅僅存儲(chǔ)目錄樹信息,而關(guān)于BLOCK的位置信息則是從各個(gè)Datanode上傳到Namenode上的。
- Namenode的目錄樹信息就是物理的存儲(chǔ)在fsimage這個(gè)文件中的,當(dāng)Namenode啟動(dòng)的時(shí)候會(huì)首先讀取fsimage這個(gè)文件,將目錄樹信息裝載到內(nèi)存中。
而edits存儲(chǔ)的是日志信息,在Namenode啟動(dòng)后所有對(duì)目錄結(jié)構(gòu)的增加,刪除,修改等操作都會(huì)記錄到edits文件中,并不會(huì)同步的記錄在fsimage中。
而當(dāng)Namenode結(jié)點(diǎn)關(guān)閉的時(shí)候,也不會(huì)將fsimage與edits文件進(jìn)行合并,這個(gè)合并的過(guò)程實(shí)際上是發(fā)生在Namenode啟動(dòng)的過(guò)程中。
也就是說(shuō),當(dāng)Namenode啟動(dòng)的時(shí)候,首先裝載fsimage文件,然后在應(yīng)用edits文件,最后還會(huì)將最新的目錄樹信息更新到新的fsimage文件中,然后啟用新的edits文件。【這個(gè)會(huì)在后面實(shí)踐的時(shí)候展示給大家看】
整個(gè)流程是沒有問(wèn)題的,但是有個(gè)小瑕疵,就是如果Namenode在啟動(dòng)后發(fā)生的改變過(guò)多,會(huì)導(dǎo)致edits文件變得非常大,大得程度與Namenode的更新頻率有關(guān)系。
那么在下一次Namenode啟動(dòng)的過(guò)程中,讀取了fsimage文件后,會(huì)應(yīng)用這個(gè)無(wú)比大的edits文件,導(dǎo)致啟動(dòng)時(shí)間變長(zhǎng),并且不可控,可能需要啟動(dòng)幾個(gè)小時(shí)也說(shuō)不定。
Namenode的edits文件過(guò)大的問(wèn)題,也就是SecondeNamenode要解決的主要問(wèn)題。
SecondNamenode(副本Namenode)保存著NameNode的部分信息(不是全部信息NameNode宕掉之后恢復(fù)數(shù)據(jù)用),是NameNode的冷備份[2]【在這里順便科普熱備份[3]】,合并fsimage和edits然后再發(fā)給namenode,防止edits文件過(guò)大,導(dǎo)致Namenode啟動(dòng)時(shí)間過(guò)長(zhǎng)。——》【執(zhí)行過(guò)程:從NameNode上 下載元數(shù)據(jù)信息(fsimage,edits),然后把二者合并,生成新的fsimage,在本地保存,并將其推送到NameNode,同時(shí)重置NameNode的edits. 】
Datanode
? 是負(fù)責(zé)存儲(chǔ)client發(fā)來(lái)的數(shù)據(jù)塊block;執(zhí)行數(shù)據(jù)塊的讀寫操作。是Namenode的小弟。 DataNode在HDFS中真正存儲(chǔ)數(shù)據(jù)。
首先解釋塊(block)的概念:
- DataNode在存儲(chǔ)數(shù)據(jù)的時(shí)候是按照block為單位讀寫數(shù)據(jù)的。block是hdfs讀寫數(shù)據(jù)的基本單位。
- 假設(shè)文件大小是100GB,從字節(jié)位置0開始,每128MB字節(jié)劃分為一個(gè)block,依此類推,可以劃分出很多的block。每個(gè)block就是128MB大小。
- block本質(zhì)上是一個(gè) 邏輯概念,意味著block里面不會(huì)真正的存儲(chǔ)數(shù)據(jù),只是劃分文件的。
- block里也會(huì)存副本,副本優(yōu)點(diǎn)是安全,缺點(diǎn)是占空間
此處上一張大神的圖片:

總結(jié)特點(diǎn)
特點(diǎn):
- 存儲(chǔ)最高TB級(jí)別大的文件
- 采用流式的數(shù)據(jù)訪問(wèn)方式
- 運(yùn)行的時(shí)候不吃硬件
不適用的場(chǎng)景:
- 低延時(shí)的數(shù)據(jù)訪問(wèn)
- 大量小文件
- 多方讀寫,需要任意的文件修改
具體的讀寫過(guò)程可以參考:【詳細(xì),值得參考,幫助理解】
要是大家還有對(duì)HDFS的讀寫有疑問(wèn),還可以參考一下鏈接:
地址:https://blog.csdn.net/wang_da_king/article/details/81258652
下一期,我們將下載hadoop,來(lái)簡(jiǎn)單體驗(yàn)一下HDFS。
-
描述數(shù)據(jù)的數(shù)據(jù),對(duì)數(shù)據(jù)及信息資源的描述性信息。(類似于Linux中的i節(jié)點(diǎn)) 。以 “blk_”開頭的文件就是 存儲(chǔ)數(shù)據(jù)的block。這里的命名是有規(guī)律的,除了block文件外,還有后 綴是“meta”的文件 ,這是block的源數(shù)據(jù)文件,存放一些元數(shù)據(jù)信息。 ? ?
-
b是a的冷備份,如果a壞掉。那么b不能馬上代替a工作。但是b上存儲(chǔ)a的一些信息,減少a壞掉之后的損失。 ?
-
b是a的熱備份,如果a壞掉。那么b馬上運(yùn)行代替a的工作。 ?