Hadoop 學習系列(二)之 HDFS 詳細解析

原文地址:http://pengtuo.tech/2018/09/10/hdfs-architecture/

Hadoop 生態(tài)是一個龐大的带兜、功能齊全的生態(tài),但是圍繞的還是名為 Hadoop 的分布式系統(tǒng)基礎架構吨灭,其核心組件由四個部分組成刚照,分別是:CommonHDFS喧兄、MapReduce 以及 YARN无畔。

  1. CommonHadoop 架構的通用組件;
  2. HDFSHadoop 的分布式文件存儲系統(tǒng)吠冤;
  3. MapReduceHadoop 提供的一種編程模型浑彰,可用于大規(guī)模數(shù)據(jù)集的并行運算;
  4. YARNHadoop 架構升級后拯辙,目前廣泛使用的資源管理器郭变。

小目標是為每一個核心組件寫一篇全解的博文颜价,本篇先來好好了解下 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

NameNodeDataNodeHDFS 系統(tǒng)的重要知識點搂抒。HDFSmaster/slave 體系結構。一個 HDFS 集群是由單個 NameNode 和眾多 DataNode 組成尿扯,文件會被分成一個或多個塊求晶,這些塊存儲在一組 DataNode 中。

因為 HDFS 是用 Java 語言搭建的衷笋,所以只要是支持 Java 語言的機器都可以運行 NameNodeDataNode芳杏。并且因為 Java 的高可移植性,HDFS 也具有非常廣泛的應用范圍辟宗。一種典型的 HDFS 部署模式是指定一個物理主機運行 NameNode爵赵,然后其余的機器運行 DataNode,在實際部署情況中泊脐,一般都是一臺主機部署一個 DataNode空幻。

群集中存在單個 NameNode 極大地簡化了系統(tǒng)的體系結構。 NameNode 是所有 HDFS 元數(shù)據(jù)的決定者和存儲庫容客。系統(tǒng)的這種設計使用戶數(shù)據(jù)永遠不會流經 NameNode秕铛,可理解 NameNode 為整個系統(tǒng)的中樞。

架構如下圖:


image

首先圖中的 rack 翻譯為“機架”缩挑,可以理解為兩個處于不同地方的機群但两,每個機群內部有自己的連接方式。其次在 DataNode 中存儲的不是當個文件供置,而是文件塊(Block)谨湘,在 HDFS 中,每個大文件會拆分成多個 Block芥丧,然后將這些 Block 散布存儲在不同的 DataNode 中紧阔,并且每個 Block 會有多個復制,也會存儲到其他的 DataNode中续担。

可以看出上圖分別解釋了“讀”和“寫”兩種操作:

  1. 當有客戶端要向 HDFS 寫入文件時寓辱,圖中將文件拆分的 Block 寫入到了兩個機架的 DataNode 中,一般情況下就是兩個機架的兩個物理主機中赤拒,可以看出文件數(shù)據(jù)沒有經過 NameNode。數(shù)據(jù)寫入的過程見(“七诱鞠、數(shù)據(jù)復制流水線”)
  2. 當有客戶端要從 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)命名空間操作隆夯,如打開,關閉和重命名文件和目錄别伏。它還確定了BlockDataNode 的映射蹄衷。

NameNode 做著有關塊復制的所有決定,它定期從群集中的每個 DataNode 接收 HeartbeatBlockreport厘肮。收到 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ā)時,它從磁盤讀取 FsImageEditLog旦部,并先將 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中的文件是一次寫入的,并且在任何時候都只能有一個寫入器抚官。

image

解釋:如圖所示扬跋,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 = 3HDFS 文件時,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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末云矫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子汗菜,更是在濱河造成了極大的恐慌让禀,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陨界,死亡現(xiàn)場離奇詭異巡揍,居然都是意外死亡,警方通過查閱死者的電腦和手機菌瘪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門腮敌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事缀皱《氛猓” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵啤斗,是天一觀的道長。 經常有香客問我赁咙,道長钮莲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任彼水,我火速辦了婚禮崔拥,結果婚禮上,老公的妹妹穿的比我還像新娘凤覆。我一直安慰自己链瓦,他們只是感情好,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布盯桦。 她就那樣靜靜地躺著慈俯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拥峦。 梳的紋絲不亂的頭發(fā)上贴膘,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音略号,去河邊找鬼刑峡。 笑死,一個胖子當著我的面吹牛玄柠,可吹牛的內容都是我干的突梦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼羽利,長吁一口氣:“原來是場噩夢啊……” “哼宫患!你這毒婦竟也來了?” 一聲冷哼從身側響起铐伴,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤撮奏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后当宴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畜吊,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年户矢,在試婚紗的時候發(fā)現(xiàn)自己被綠了玲献。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捌年,靈堂內的尸體忽然破棺而出瓢娜,到底是詐尸還是另有隱情,我是刑警寧澤礼预,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布眠砾,位于F島的核電站,受9級特大地震影響托酸,放射性物質發(fā)生泄漏褒颈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一励堡、第九天 我趴在偏房一處隱蔽的房頂上張望谷丸。 院中可真熱鬧,春花似錦应结、人聲如沸刨疼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揩慕。三九已至,卻和暖如春砾层,著一層夾襖步出監(jiān)牢的瞬間漩绵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工肛炮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留止吐,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓侨糟,卻偏偏與公主長得像碍扔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子秕重,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容

  • 首先不同,我們在使用前先看看HDFS是什麼?這將有助于我們是以后的運維使用和故障排除思路的獲得溶耘。 HDFS采用mast...
    W_Bousquet閱讀 4,181評論 0 2
  • 1.Hadoop HDFS架構向導的目的 在這篇關于HDFS文章結構的指南里二拐,你可以讀到所有關于HDFS的東西。首...
    Simple_Coder閱讀 2,278評論 0 1
  • 又快到了一年一度的圣誕節(jié)凳兵,我也快到24歲了百新。 仔細了回顧了從高考之后的這段時光,似乎一直過得渾渾噩噩庐扫,隨遇而安饭望,二...
    漸行漸遠_8144閱讀 425評論 0 0
  • 換工作第二天了仗哨,還是靜不下來,心很亂铅辞。 今天犯了好幾個錯厌漂,早上,第一件事給李總打印資料斟珊,明明自己都知道有這個經...
    upup_ac33閱讀 242評論 0 0
  • 今天有朋友問了一個問題:學歷重要么囤踩?當時一撥人展開了很大的討論雏节,大家都闡述自己的觀點,當然包括我高职。今天,在思思的小...
    玉思盈蝶閱讀 523評論 2 3