Hadoop
生態(tài)是一個龐大的带兜、功能齊全的生態(tài),但是圍繞的還是名為 Hadoop
的分布式系統(tǒng)基礎架構吨灭,其核心組件由四個部分組成刚照,分別是:Common
、HDFS
喧兄、MapReduce
以及 YARN
无畔。
-
Common
是Hadoop
架構的通用組件; -
HDFS
是Hadoop
的分布式文件存儲系統(tǒng)吠冤; -
MapReduce
是Hadoop
提供的一種編程模型浑彰,可用于大規(guī)模數(shù)據(jù)集的并行運算; -
YARN
是Hadoop
架構升級后拯辙,目前廣泛使用的資源管理器郭变。
小目標是為每一個核心組件寫一篇全解的博文颜价,本篇先來好好了解下 HDFS
。
一诉濒、介紹
HDFS(The Hadoop Distributed File System)周伦,是被設計成適合運行在通用硬件(commodity hardware
)上的 Hadoop
的分布式文件系統(tǒng)。它與其他的分布式系統(tǒng)有非常顯著的不同未荒,首先 HDFS
具有高容錯性专挪,并且它可以被部署到廉價的硬件上。此外片排,HDFS
提供對應用程序數(shù)據(jù)的高吞吐量訪問寨腔,適用于具有大型數(shù)據(jù)集的應用程序。
目前划纽,HDFS
作為 Apache Hadoop
的核心項目脆侮,URL為:http://hadoop.apache.org/
二、HDFS 優(yōu)點
2.1 硬件故障防治
一個 HDFS
實例有可能包含數(shù)百臺或數(shù)千臺服務器勇劣,每一個臺機器都存儲文件系統(tǒng)數(shù)據(jù)的一部分靖避,這種情況下硬件故障是常態(tài)。而 HDFS
可檢測故障并從中快速自動恢復比默。
2.2 流數(shù)據(jù)訪問
HDFS
設計用于批處理而不是用戶的交互式使用幻捏,其重點是數(shù)據(jù)訪問的高吞吐量而并不追求數(shù)據(jù)訪問的低延遲。
2.3 處理大數(shù)據(jù)集
HDFS
的核心目標就是為處理具有大數(shù)據(jù)量的應用命咐,在其上運行的應用的文件大小一般都為 TB
級別篡九。HDFS
可提供高聚合數(shù)據(jù)帶寬并且要擴展到集群中的數(shù)百個節(jié)點上,并對于單個應用可支持上千萬個文件醋奠。
2.4 簡單一致模型
HDFS
應用程序是一個"一次寫入多次讀取"的文件訪問模型榛臼。這種模型可以簡化數(shù)據(jù)的一致性問題并且能夠實現(xiàn)高吞吐數(shù)據(jù)訪問。官方文檔表示有計劃支持追加寫入文件的功能窜司。
2.5 移動計算替代移動數(shù)據(jù)
“Moving Computation is Cheaper than Moving Data”沛善,當一個計算程序與數(shù)據(jù)同在一個物理節(jié)點上時,運算最高效塞祈,特別是當數(shù)據(jù)量特別大時金刁,移動計算遠優(yōu)于移動數(shù)據(jù)集。移動計算可以最大限度地減少網絡擁塞并提高系統(tǒng)的整體吞吐量议薪。HDFS
設計的是將計算遷移到更靠近數(shù)據(jù)所在的位置尤蛮,而不是將數(shù)據(jù)移動到運行應用程序的位置。HDFS
為應用程序提供了接口斯议,使其自身更靠近數(shù)據(jù)产捞。
2.6 跨異構硬件和軟件平臺的可移植性
HDFS
的設計便于從一個平臺移植到另一個平臺。 這有助于廣泛采用 HDFS
作為大量應用程序的首選大數(shù)據(jù)處理平臺捅位。
三轧葛、NameNode & DataNodes
NameNode
與 DataNode
是 HDFS
系統(tǒng)的重要知識點搂抒。HDFS
是 master/slave
體系結構。一個 HDFS
集群是由單個 NameNode
和眾多 DataNode
組成尿扯,文件會被分成一個或多個塊求晶,這些塊存儲在一組 DataNode
中。
因為 HDFS
是用 Java 語言搭建的衷笋,所以只要是支持 Java 語言的機器都可以運行 NameNode
和 DataNode
芳杏。并且因為 Java 的高可移植性,HDFS
也具有非常廣泛的應用范圍辟宗。一種典型的 HDFS
部署模式是指定一個物理主機運行 NameNode
爵赵,然后其余的機器運行 DataNode
,在實際部署情況中泊脐,一般都是一臺主機部署一個 DataNode
空幻。
群集中存在單個 NameNode
極大地簡化了系統(tǒng)的體系結構。 NameNode
是所有 HDFS
元數(shù)據(jù)的決定者和存儲庫容客。系統(tǒng)的這種設計使用戶數(shù)據(jù)永遠不會流經 NameNode
秕铛,可理解 NameNode
為整個系統(tǒng)的中樞。
架構如下圖:
首先圖中的 rack
翻譯為“機架”缩挑,可以理解為兩個處于不同地方的機群但两,每個機群內部有自己的連接方式。其次在 DataNode
中存儲的不是當個文件供置,而是文件塊(Block)谨湘,在 HDFS
中,每個大文件會拆分成多個 Block
芥丧,然后將這些 Block
散布存儲在不同的 DataNode
中紧阔,并且每個 Block
會有多個復制,也會存儲到其他的 DataNode
中续担。
可以看出上圖分別解釋了“讀”和“寫”兩種操作:
- 當有客戶端要向
HDFS
寫入文件時寓辱,圖中將文件拆分的Block
寫入到了兩個機架的DataNode
中,一般情況下就是兩個機架的兩個物理主機中赤拒,可以看出文件數(shù)據(jù)沒有經過NameNode
。數(shù)據(jù)寫入的過程見(“七诱鞠、數(shù)據(jù)復制流水線”) - 當有客戶端要從
HDFS
讀取文件時挎挖,會將操作命令傳向NameNode
,然后NameNode
轉為對應的數(shù)據(jù)塊的操作航夺,指揮相應的DataNode
將所需數(shù)據(jù)返回給客戶端蕉朵。
還有一個節(jié)點圖中沒有顯示,叫作
Secondary Namenode
阳掐,是輔助后臺程序始衅,主要負責與NameNode
進行通信冷蚂,定期保存HDFS
元數(shù)據(jù)的快照及備份其他NameNode
中的內容,日常Standby
汛闸,當NameNode
故障時頂替NameNode
使用蝙茶。
NameNode
NameNode
是管理文件系統(tǒng)命名空間的主服務器,用于管理客戶端對文件的訪問诸老,執(zhí)行文件系統(tǒng)命名空間操作隆夯,如打開,關閉和重命名文件和目錄别伏。它還確定了Block
到 DataNode
的映射蹄衷。
NameNode
做著有關塊復制的所有決定,它定期從群集中的每個 DataNode
接收 Heartbeat
和 Blockreport
厘肮。收到 Heartbeat
意味著 DataNode
正常運行愧口,Blockreport
包含 DataNode
上所有塊的列表。
DataNode
DataNode
通常是群集中每個節(jié)點一個类茂,用于存儲數(shù)據(jù)耍属,負責提供來自文件系統(tǒng)客戶端的讀寫請求。并且還會根據(jù) NameNode
的指令執(zhí)行塊創(chuàng)建大咱,刪除和復制恬涧。
四、HDFS文件系統(tǒng)命名空間及元數(shù)據(jù)
HDFS
支持傳統(tǒng)的分層文件組織碴巾,文件系統(tǒng)命名空間層次結構與大多數(shù)其他現(xiàn)有文件系統(tǒng)類似溯捆,一個用戶或者應用可以創(chuàng)建文件夾并且在這個文件夾里存儲文件。但是 HDFS
不支持 Linux 里的硬鏈接和軟連接厦瓢。NameNode
維護著文件系統(tǒng)的命名空間提揍,其記錄對文件系統(tǒng)命名空間或其屬性的任何更改,NameNode
還會存儲復制因子煮仇。
數(shù)據(jù)塊的副本數(shù)稱為該數(shù)據(jù)塊的復制因子
文件系統(tǒng)的元數(shù)據(jù)(MetaData
)也存儲在 NameNode
中劳跃,NameNode
使用名為 EditLog
的事務日志來持久記錄文件系統(tǒng)元數(shù)據(jù)發(fā)生的每個更改。例如浙垫,在 HDFS
中創(chuàng)建新文件會導致 NameNode
將記錄插入 EditLog
刨仑,以指示此情況。NameNode
使用其本地主機OS文件系統(tǒng)中的文件來存儲 EditLog
夹姥。
而整個文件系統(tǒng)命名空間(包括塊到文件和文件系統(tǒng)屬性的映射)存儲在名為 FsImage
的文件中杉武。 FsImage
也作為文件存儲在 NameNode
的本地文件系統(tǒng)中。
元數(shù)據(jù)的持久化
NameNode
在整個內存中保存整個文件系統(tǒng)命名空間和文件的數(shù)據(jù)塊映射辙售。當 NameNode
啟動轻抱,或者檢查點由可配置的閾值觸發(fā)時,它從磁盤讀取 FsImage
和 EditLog
旦部,并先將 FsImage
中的文件系統(tǒng)元數(shù)據(jù)信息加載到內存祈搜,然后把 EditLog
中的所有事務應用到內存中的 FsImage
较店,最后將此新版本同步到磁盤上的 FsImage
。然后它可以截斷舊的 EditLog
容燕,因為它的事務已應用于持久性 FsImage
梁呈。此過程稱為檢查點。
檢查點的目的是通過獲取文件系統(tǒng)元數(shù)據(jù)的快照并將其保存到 FsImage
來確保 HDFS
具有文件系統(tǒng)元數(shù)據(jù)的一致視圖缰趋。盡管直接從內存中讀取 FsImage
很高效捧杉,但直接對 FsImage
進行增量編輯效率不高。我們不會修改每個編輯的 FsImage
秘血,而是在 Editlog
中保留編輯內容味抖。
在檢查點期間,Editlog
的更改將應用于 FsImage
灰粮∽猩可以以秒為單位的給定時間間隔(dfs.namenode.checkpoint.period)觸發(fā)檢查點,或者在累積給定數(shù)量的文件系統(tǒng)事務(dfs.namenode.checkpoint.txns)之后觸發(fā)檢查點粘舟。如果同時設置了這兩個屬性熔脂,則一旦滿足其中一個閾值就可觸發(fā)檢查點。
五柑肴、數(shù)據(jù)復制(Data Replication)
HDFS
旨在跨大型集群中的計算機可靠地存儲非常大的文件霞揉。它將每個文件存儲為一系列塊,除最后一個塊之外的文件中的所有塊都具有相同的大小晰骑,HDFS
使用的默認塊大小為 128MB适秩。復制文件的塊以實現(xiàn)容錯,且一般復制出的文件塊會存儲到不同的 DataNode
中硕舆。數(shù)據(jù)塊的大小以及復制因子都是可以由用戶設置秽荞。
HDFS中的文件是一次寫入的,并且在任何時候都只能有一個寫入器抚官。
解釋:如圖所示扬跋,part-0
文件復制因子為r:2
,其拆分的數(shù)據(jù)塊號有{1,3}
凌节,所以 1 號數(shù)據(jù)塊在第1钦听,第3個 DataNode
上,3 號數(shù)據(jù)塊在第5倍奢,第6個DataNode
上彪见;part-1
文件解釋同理。而這些信息都存儲在 NameNode
中娱挨。
HDFS 副本存放策略
剛剛只是簡單的介紹了圖里的信息,實際 HDFS
副本放置策略是一個值得研究的課題捕犬,因為這切實關系到 HDFS
的可依賴性與表現(xiàn)跷坝,并且經過優(yōu)化的副本放置策略也使得 HDFS
相比其他分布式文件系統(tǒng)具有優(yōu)勢酵镜。
在大部分的實際案例中,當復制因子是 r = 3
時柴钻,HDFS
的放置策略是將一個復制品放置到寫入器操作的 DataNode
中淮韭,第二個復制品放置到另一個遠程機架上的一個節(jié)點中,然后最后一個復制品則放置同一個遠程機架的不同物理節(jié)點中贴届。
這種放置策略可以有效的減少機架之中的通信以提高系統(tǒng)的表現(xiàn)靠粪。因為不同機架的物理節(jié)點的通信需要通過交換機,而在大多數(shù)情況下毫蚓,同一機架中的計算機之間的網絡帶寬大于不同機架中的計算機之間的網絡帶寬占键。
如果復制因子大于3,則隨機確定第4個及以后副本的放置元潘,同時保持每個機架的副本數(shù)量低于上限畔乙。
上限數(shù)一般為(副本數(shù)-1)/ 機架 + 2
由于 NameNode
不允許 DataNode
具有同一塊的多個副本,因此翩概,能創(chuàng)建的最大副本數(shù)是此時 DataNode
的總數(shù)牲距。
當有客戶端請求讀取時,HDFS
為了最小化全局帶寬消耗與讀取延遲钥庇,會優(yōu)先選擇離讀取客戶端最近的數(shù)據(jù)副本牍鞠。
六、通信協(xié)議
所有 HDFS
通信協(xié)議都分層在 TCP/IP
協(xié)議之上评姨。
七难述、數(shù)據(jù)復制流水線
當客戶端將數(shù)據(jù)寫入復制因子為 r = 3
的 HDFS
文件時,NameNode
使用 replication target choosing algorithm
檢索 DataNode
列表参咙。此列表包含將承載該塊副本的 DataNode
龄广。
然后客戶端向第一個 DataNode
寫入,第一個 DataNode
開始分批接收數(shù)據(jù)蕴侧,將每個部分寫入其本地存儲择同,并將該部分傳輸?shù)搅斜碇械牡诙€ DataNode
。第二個 DataNode
又開始接收數(shù)據(jù)塊的每個部分净宵,將該部分寫入其存儲敲才,然后將該部分刷新到第三個 DataNode
。最后择葡,第三個 DataNode
將數(shù)據(jù)寫入其本地存儲紧武。
可見,DataNode
是從流水線中的前一個接收數(shù)據(jù)敏储,同時將數(shù)據(jù)轉發(fā)到流水線中的下一個阻星,數(shù)據(jù)是從一個 DataNode
流水線到下一個 DataNode
。
八、可操作
應用可以以多種方式操控 HDFS
上的文件妥箕,其中通過 FS Shell
可以像操控 Linux
文件系統(tǒng)一般滥酥,常用命令有:
Action | Command |
---|---|
創(chuàng)建 foodir 文件夾 | bin/hadoop fs -mkdir /foodir |
刪除文件夾 | bin/hadoop fs -rm -R /foodir |
查看文件內容 | bin/hdfs dfs -cat /foodir/myfile.txt |
上傳文件 | bin/hdfs dfs -copyFromLocal ~/a.txt /foodir/ |
…… | …… |
會發(fā)現(xiàn)這里有兩種命令前綴,一個是
hadoop fs
畦幢,一個是hdfs dfs
區(qū)別是:
hadoop fs
可以用于其他文件系統(tǒng)坎吻,不止是hdfs文件系統(tǒng)內,也就是說該命令的使用范圍更廣宇葱;而hdfs dfs
專門針對hdfs分布式文件系統(tǒng)瘦真。還有一個前綴為
hadoop dfs
,這個已經過時黍瞧,建議不要使用??诸尽。
九、空間回收
9.1 文件刪除和取消刪除
如果啟用了垃圾箱配置雷逆,則 FS Shell
刪除的文件不會立即從 HDFS
中刪除弦讽,而是 HDFS
將其移動到垃圾目錄(/user/username/.Trash)。
在垃圾箱中膀哲,被刪除文件的生命周期到期后往产,NameNode
將從 HDFS
命名空間中刪除該文件。刪除文件會導致釋放與文件關聯(lián)的塊某宪。
注意:在用戶刪除文件的時間與
HDFS
中相應增加的可用空間之間可能存在明顯的時間延遲仿村。
如果啟用了垃圾箱配置,想直接徹底刪除兴喂,命令為:hadoop fs -rm -r -skipTrash a.txt
9.2 減少復制因子
當文件的復制因子減少時蔼囊,NameNode
選擇可以刪除的多余副本。下一個 Heartbeat
將此信息傳輸?shù)?DataNode
衣迷。然后畏鼓,DataNode
刪除相應的塊,并在群集中顯示相應的可用空間壶谒。
參考
[1] Hadoop JavaDoc API
[2] HDFS 源碼: http://hadoop.apache.org/version_control.html
[3] HDFS 文檔:
http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html