標籤:
Distributed File SystemHDFS的工作原理
HadoopDistributed File System(HDFS)是一種被設計成適合運行在通用硬體上的Distributed File System。HDFS是一個高度容錯性的系統,適合部署在廉價的機器上。它能提供高輸送量的資料訪問,非常適合大規模資料集上的應用。要理解HDFS的內部工作原理,首先要理解什麼是Distributed File System。
1、Distributed File System
多台電腦連網協同工作(有時也稱為一個叢集)就像單台系統一樣解決某種問題,這樣的系統我們稱之為分布式系統。
Distributed File System是分布式系統的一個子集,它們解決的問題就是資料存放區。換句話說,它們是橫跨在多台電腦上的儲存系統。儲存在Distributed File System上的資料自動分布在不同的節點上。
Distributed File System在大資料時代有著廣泛的應用前景,它們為儲存和處理來自網路和其它地方的超大規模資料提供所需的擴充能力。
2、分離中繼資料和資料:NameNode和DataNode
儲存到檔案系統中的每個檔案都有相關聯的中繼資料。中繼資料套件括了檔案名稱、i節點(inode)數、資料區塊位置等,而資料則是檔案的實際內容。
在傳統的檔案系統裡,因為檔案系統不會跨越多台機器,中繼資料和資料存放區在同一台機器上。
為了構建一個Distributed File System,讓用戶端在這種系統中使用簡單,並且不需要知道其他用戶端的活動,那麼中繼資料需要在用戶端以外維護。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中的⑥)
圖1 HDFS寫過程
在Distributed File System的設計中,挑戰之一是如何確保資料的一致性。對於HDFS來說,直到所有要儲存資料的DataNodes確認它們都有檔案的副本時,資料才被認為寫入完成。因此,資料一致性是在寫的階段完成的。一個用戶端無論選擇從哪個DataNode讀取,都將得到相同的資料。
4、HDFS讀過程
為了理解讀的過程,可以認為一個檔案是由儲存在DataNode上的資料區塊組成的。用戶端查看之前寫入的內容的執行流程2所示,具體步驟為:
第一步:用戶端詢問NameNode它應該從哪裡讀取檔案。(2中的①)
第二步:NameNode發送資料區塊的資訊給用戶端。(資料區塊資訊包含了儲存著檔案副本的DataNode的IP地址,以及DataNode在本地硬碟尋找資料區塊所需要的資料區塊ID。) (2中的②)
第三步:用戶端檢查資料區塊資訊,聯絡相關的DataNode,請求資料區塊。(2中的③)
第四步:DataNode返迴文件內容給用戶端,然後關閉串連,完成讀操作。(2中的④)
圖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上。 ref:http://www.thebigdata.cn/Hadoop/15623.html
大資料 --> Distributed File SystemHDFS的工作原理