天天看點

Hadoop分布式檔案系統HDFS的工作原理詳述

Hadoop分布式檔案系統(HDFS)是一種被設計成适合運作在通用硬體上的分布式檔案系統。HDFS是一個高度容錯性的系統,适合部署在廉價的機器上。它能提供高吞吐量的資料通路,非常适合大規模資料集上的應用。要了解HDFS的内部工作原理,首先要了解什麼是分布式檔案系統。

1.分布式檔案系統

多台計算機聯網協同工作(有時也稱為一個叢集)就像單台系統一樣解決某種問題,這樣的系統我們稱之為分布式系統。

分布式檔案系統是分布式系統的一個子集,它們解決的問題就是資料存儲。換句話說,它們是橫跨在多台計算機上的存儲系統。存儲在分布式檔案系統上的資料自動分布在不同的節點上。

分布式檔案系統在大資料時代有着廣泛的應用前景,它們為存儲和處理來自網絡和其它地方的超大規模資料提供所需的擴充能力。

2.分離中繼資料和資料:NameNode和DataNode

存儲到檔案系統中的每個檔案都有相關聯的中繼資料。中繼資料包括了檔案名、i節點(inode)數、資料塊位置等,而資料則是檔案的實際内容。

在傳統的檔案系統裡,因為檔案系統不會跨越多台機器,中繼資料和資料存儲在同一台機器上。

為了建構一個分布式檔案系統,讓用戶端在這種系統中使用簡單,并且不需要知道其他用戶端的活動,那麼中繼資料需要在用戶端以外維護。HDFS的設計理念是拿出一台或多台機器來儲存中繼資料,并讓剩下的機器來儲存檔案的内容。

NameNode和DataNode是HDFS的兩個主要元件。其中,中繼資料存儲在NameNode上,而資料存儲在DataNode的叢集上。NameNode不僅要管理存儲在HDFS上内容的中繼資料,而且要記錄一些事情,比如哪些節點是叢集的一部分,某個檔案有幾份副本等。它還要決定當叢集的節點當機或者資料副本丢失的時候系統需要做什麼。

存儲在HDFS上的每份資料片有多份副本(replica)儲存在不同的伺服器上。在本質上,NameNode是HDFS的Master(主伺服器),DataNode是Slave(從伺服器)。

3.HDFS寫過程

NameNode負責管理存儲在HDFS上所有檔案的中繼資料,它會确認用戶端的請求,并記錄下檔案的名字和存儲這個檔案的DataNode集合。它把該資訊存儲在記憶體中的檔案配置設定表裡。

例如,用戶端發送一個請求給NameNode,說它要将“zhou.log”檔案寫入到HDFS。那麼,其執行流程如圖1所示。具體為:

第一步:用戶端發消息給NameNode,說要将“zhou.log”檔案寫入。(如圖1中的①)

第二步:NameNode發消息給用戶端,叫用戶端寫到DataNode A、B和D,并直接聯系DataNode B。(如圖1中的②)

第三步:用戶端發消息給DataNode B,叫它儲存一份“zhou.log”檔案,并且發送一份副本給DataNode A和DataNode D。(如圖1中的③)

第四步:DataNode B發消息給DataNode A,叫它儲存一份“zhou.log”檔案,并且發送一份副本給DataNode D。(如圖1中的④)

第五步:DataNode A發消息給DataNode D,叫它儲存一份“zhou.log”檔案。(如圖1中的⑤)

第六步:DataNode D發确認消息給DataNode A。(如圖1中的⑤)

第七步:DataNode A發确認消息給DataNode B。(如圖1中的④)

第八步:DataNode B發确認消息給用戶端,表示寫入完成。(如圖1中的⑥)

Hadoop分布式檔案系統HDFS的工作原理詳述

圖1 HDFS寫過程示意圖

在分布式檔案系統的設計中,挑戰之一是如何確定資料的一緻性。對于HDFS來說,直到所有要儲存資料的DataNodes确認它們都有檔案的副本時,資料才被認為寫入完成。是以,資料一緻性是在寫的階段完成的。一個用戶端無論選擇從哪個DataNode讀取,都将得到相同的資料。

4.HDFS讀過程

為了了解讀的過程,可以認為一個檔案是由存儲在DataNode上的資料塊組成的。用戶端檢視之前寫入的内容的執行流程如圖2所示,具體步驟為:

第一步:用戶端詢問NameNode它應該從哪裡讀取檔案。(如圖2中的①)

第二步:NameNode發送資料塊的資訊給用戶端。(資料塊資訊包含了儲存着檔案副本的DataNode的IP位址,以及DataNode在本地硬碟查找資料塊所需要的資料塊ID。) (如圖2中的②)

第三步:用戶端檢查資料塊資訊,聯系相關的DataNode,請求資料塊。(如圖2中的③)

第四步:DataNode傳回檔案内容給用戶端,然後關閉連接配接,完成讀操作。(如圖2中的④)

Hadoop分布式檔案系統HDFS的工作原理詳述

圖2 HDFS讀過程示意圖

用戶端并行從不同的DataNode中擷取一個檔案的資料塊,然後聯結這些資料塊,拼成完整的檔案。

5.通過副本快速恢複硬體故障

當一切運作正常時,DataNode會周期性發送心跳資訊給NameNode(預設是每3秒鐘一次)。如果NameNode在預定的時間内沒有收到心跳資訊(預設是10分鐘),它會認為DataNode出問題了,把它從叢集中移除,并且啟動一個程序去恢複資料。DataNode可能因為多種原因脫離叢集,如硬體故障、主機闆故障、電源老化和網絡故障等。

對于HDFS來說,丢失一個DataNode意味着丢失了存儲在它的硬碟上的資料塊的副本。假如在任意時間總有超過一個副本存在(預設3個),故障将不會導緻資料丢失。當一個硬碟故障時,HDFS會檢測到存儲在該硬碟的資料塊的副本數量低于要求,然後主動建立需要的副本,以達到滿副本數狀态。

6.跨多個DataNode切分檔案

在HDFS裡,檔案被切分成資料塊,通常每個資料塊64MB~128MB,然後每個資料塊被寫入檔案系統。同一個檔案的不同資料塊不一定儲存在相同的DataNode上。這樣做的好處是,當對這些檔案執行運算時,能夠通過并行方式讀取和處理檔案的不同部分。

當用戶端準備寫檔案到HDFS并詢問NameNode應該把檔案寫到哪裡時,NameNode會告訴用戶端,那些可以寫入資料塊的DataNode。寫完一批資料塊後,用戶端會回到NameNode擷取新的DataNode清單,把下一批資料塊寫到新清單中的DataNode上。

繼續閱讀