我們依然是先過(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在最開(kāi)始是作為Apache Nutch搜索引擎項(xiàng)目的基礎(chǔ)架構(gòu)而開(kāi)發(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)的名字空間操作瘫里,比如打開(kāi)、關(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ì)跟大家的感覺(jué)一樣闷尿,像是在本地上傳到本地的感覺(jué)。
? 而實(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根目錄的感覺(jué)桨武。
- 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è)流程是沒(méi)有問(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開(kāi)始严肪,每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_”開(kāi)頭的文件就是 存儲(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的工作。 ?