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