這篇文章將為大家詳細(xì)講解有關(guān)HDFS工作機(jī)制是什么,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、喀什ssl等。為成百上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的喀什網(wǎng)站制作公司
HDFS(Hadoop Distributed File System)分布式文件系統(tǒng),它是谷歌的GFS提出后出現(xiàn)的一種用戶級文件系統(tǒng)。提供了一個高度容錯和高吞吐量的海量數(shù)據(jù)存儲解決方案。
hadoop生態(tài)-HDFS的核心位置
1
2
3
常見錯誤種類
節(jié)點(diǎn)故障
通信故障和數(shù)據(jù)損壞
讀寫故障
以上是漫畫解說部分,主要涵蓋了讀寫流程已經(jīng)故障處理。下面會有具體的架構(gòu)講解。
維護(hù)和管理DataNodes
管理文件系統(tǒng)namespace并控制client對應(yīng)的訪問權(quán)限
記錄所有存儲在集群中的文件的元信息。eg: blocks存儲的位置、文件的大小、權(quán)限、文件結(jié)構(gòu)等,有兩個文件和元數(shù)據(jù)關(guān)聯(lián)著FsImage
保存了最新的元數(shù)據(jù)檢查點(diǎn),包含了整個HDFS文件系統(tǒng)的所有目錄和文件的信息。對于文件來說包括了數(shù)據(jù)塊描述信息、修改時間、訪問時間等;對于目錄來說包括修改時間、訪問權(quán)限控制信息(目錄所屬用戶,所在組)等。
一般開始時namenode的操作都放在EditLog中,然后通過異步更新。EditLog
記錄最近通過namenode對文件系統(tǒng)的所有修改操作。
記錄文件系統(tǒng)的所有操作元數(shù)據(jù)。 存儲在 EditLogs
維護(hù)著與DataNodes的心跳檢測
DataNodes磁盤存儲均衡、DataNodes故障轉(zhuǎn)移
數(shù)據(jù)存儲節(jié)點(diǎn)
它的主要職責(zé)
備用節(jié)點(diǎn),也稱為standby namenode。NameNode是HDFS的大腦核心,一旦NameNode出現(xiàn)不可用,那么整個HDFS集群將不可用,Secondary NameNode作為NameNode的備用節(jié)點(diǎn),進(jìn)行NameNode容錯
負(fù)責(zé)合并Editlogs和FsImage
定時從 namenode 下載Editlogs并和現(xiàn)有FsImage進(jìn)行合并,然后將合并后的FsImage更新到namenode
FailoverController
故障切換器,管理著將活動namenode轉(zhuǎn)移為備用namenode的過程,默認(rèn)通過ZK來確保僅有一個活躍namenode。每一個namenode都有一個運(yùn)行著的故障轉(zhuǎn)移器。
用于平衡DataNode集群之間各節(jié)點(diǎn)的磁盤利用率。
提供Http方式訪問和操作HDFS功能
上面幾個概念的拓?fù)鋱D
HDFS里的數(shù)據(jù)都是以blocks分散在DataNodes。
通常,文件系統(tǒng)我們存放數(shù)據(jù)都是以一個blocks集進(jìn)行存儲,HDFS也是如此。
在 hadoop 集群中,每個 block 的默認(rèn)大小為 128M(此處指 hadoop 2.x 版本,hadoop 1.x 版本為 64M),也可以通過配置進(jìn)行修改
dfs.block.size或 dfs.blocksize =64M
HDFS 不會將每個文件存儲在配置的 block 大小的確切倍數(shù)中,比如一個 514M 的文件 example.txt,下圖所示,假設(shè) block 大小為默認(rèn)的 128M,那么將會創(chuàng)建 5 個block,前 4 個 block 大小為 128M,但是最后一個 block 的大小則僅為 2M。
block大小的設(shè)置,如果太小會產(chǎn)生太多的blocks,這樣元數(shù)據(jù)就會很多,從而使管理blocks和元數(shù)據(jù)產(chǎn)生巨大開銷,增加NameNode和DataNode的負(fù)載。
假如我們要一個文件名字“example.txt”,248M。
假設(shè)block.size設(shè)置的128M,因此client會把該文件切分成兩個block,分布是 128M和120M。
每當(dāng)向HDFS寫數(shù)據(jù)的時候,都遵循下面的幾個流程
HDFS client 向NameNode 發(fā)送 兩個blocks(blockA、blockB)的寫入請求
NameNode給client進(jìn)行寫入授權(quán)并提供用來進(jìn)行存儲和復(fù)制的DataNodes IP
DataNodes基于HDFS可用性、復(fù)制因子和機(jī)架感知的選擇是完全隨機(jī)的
假設(shè)復(fù)制因子設(shè)置的是3,那么NameNode將為每個blocks提供3個DataNodes IP。 相對每個block提供的3個DataNodes都是唯一的。假設(shè)NameNode提供的DataNodes列表如下:
For Block A, list A = {IP of DataNode 1, IP of DataNode 4, IP of DataNode 6}
For Block B, set B = {IP of DataNode 3, IP of DataNode 7, IP of DataNode 9}
每個block將在三個不同的DataNode進(jìn)行復(fù)制,維持整個集群的復(fù)制因子一致性
接下來整個數(shù)據(jù)將會經(jīng)歷下面三個階段:1建立管道 2數(shù)據(jù)流與復(fù)制 3管道關(guān)閉及確認(rèn)
client在blocks寫入之前會確保提供的DataNodes是否已經(jīng)做好接受數(shù)據(jù)的準(zhǔn)備。在這樣的情況下,client會連接該block列表中的各個DataNodes,為每個block建一個管道。以BlockA舉例,它的DN(DataNode)列表是 { DN 1 IP, DN 4 IP, DN 6 IP }
如上圖,大概有一下幾個步驟:
client 拿著 blockA 向 NameNode發(fā)起寫請求
NameNode返回一組可供存儲和復(fù)制的DN IP列表
client向 DN1 進(jìn)行寫入準(zhǔn)備確認(rèn),同時會告訴DN1接下來要進(jìn)行復(fù)制的DN4和DN6的IP
DN1 會向 DN4發(fā)起寫入準(zhǔn)備確認(rèn),依次類推DN4給DN6發(fā)送確認(rèn)
DN6 確認(rèn)完畢回傳給 DN4,DN4確認(rèn)后會將自己以及DN6的確認(rèn)信息給DN1,最后DN1將三個DN的確認(rèn)結(jié)果答復(fù)給client
管道建立完畢,client將開始進(jìn)行數(shù)據(jù)復(fù)制或者數(shù)據(jù)處理
當(dāng)client與DataNodes之間的管道建立之后,client將開始將推送數(shù)據(jù)到管道。我們這里假設(shè)的復(fù)制因子是3,所以blockA將被復(fù)制三份,但是注意的是client只會將blockA推送到DN1,然后由DataNodes自己按照順序進(jìn)行復(fù)制。
如上圖所示,整個復(fù)制過程步驟如下:
client 將blockA寫入DN1,接著DN1連接DN4
DN1通過管道向DN4復(fù)制數(shù)據(jù)
DN4數(shù)據(jù)寫完后會繼續(xù)連接DN6進(jìn)行最后一份數(shù)據(jù)的復(fù)制
當(dāng)block復(fù)制3份完成后,client和NameNode會有一系列的ack確認(rèn)來保證數(shù)據(jù)被成功寫入。
如下圖所示,DataNodes的確認(rèn)和寫入的順序恰好相反,DN6寫入成功后會給DN4發(fā)送確認(rèn)消息,接著DN4會將DN6和自己的確認(rèn)消息發(fā)送給DN1,最后DN1將所有的確認(rèn)消息發(fā)送給client,client再給NameNode確認(rèn)block寫入成功,然后NameNode更新對應(yīng)的元數(shù)據(jù),最終client關(guān)閉管道。
以上的所有流程,我們都是針對blockA進(jìn)行解說,而blockB是完全一樣的,blockB有自己的管道、自己的DataNodes并行的進(jìn)行寫入。
如上圖所示,有兩個管道分別為blokA和blockB提供,他們各自的流程順序如下:
For Block A: 1A -> 2A -> 3A -> 4A
For Block B: 1B -> 2B -> 3B -> 4B -> 5B -> 6B
讀的原理相對寫更容易理解,我們同樣以example.txt舉例。
如上圖所示,有以下幾個步驟
client請求NameNode 要讀取example.txt的數(shù)據(jù),NameNode查詢元數(shù)據(jù),將該文件對應(yīng)的所有block及對應(yīng)的DataNode列表返回
client并行的分別從DataNodes讀取blockA和blockB的數(shù)據(jù)。為了保證低延遲和節(jié)約帶寬,通常會選擇離client近的副本進(jìn)行讀取,如果可能,會選擇和閱讀節(jié)點(diǎn)在同一個機(jī)架上的副本(如圖中所示,選擇了Rack1, blockA和blockB都有對應(yīng)的副本)
client一旦獲取到所有的block,就會開始組裝成文件,并返回。
關(guān)于“HDFS工作機(jī)制是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。