Hadoop分佈式文件系統HDFS的工做原理

Hadoop分佈式文件系統(HDFS)是一種被設計成適合運行在通用硬件上的分佈式文件系統。HDFS是一個高度容錯性的系統,適合部署在廉價的機器上。它能提供高吞吐量的數據訪問,很是適合大規模數據集上的應用。要理解HDFS的內部工做原理,首先要理解什麼是分佈式文件系統。html

1 、分佈式文件系統

多臺計算機聯網協同工做(有時也稱爲一個集羣)就像單臺系統同樣解決某種問題,這樣的系統咱們稱之爲分佈式系統。node

分佈式文件系統是分佈式系統的一個子集,它們解決的問題就是數據存儲。服務器

換句話說,它們是橫跨在多臺計算機上的存儲系統。存儲在分佈式文件系統上的數據自動分佈在不一樣的節點上。網絡

分佈式文件系統在大數據時代有着普遍的應用前景,它們爲存儲和處理來自網絡和其它地方的超大規模數據提供所需的擴展能力。分佈式

2 、分離元數據和數據:NameNode和DataNode

存儲到文件系統中的每一個文件都有相關聯的元數據。元數據包括了文件名、i 節點(inode )數、數據塊位置等,而數據則是文件的實際內容。oop

在傳統的文件系統裏,由於文件系統不會跨越多臺機器,元數據和數據存儲在同一臺機器上。大數據

爲了構建一個分佈式文件系統,讓客戶端在這種系統中使用簡單,而且不須要知道其餘客戶端的活動,那麼元數據須要在客戶端之外維護。HDFS的設計理念是拿出一臺或多臺機器來保存元數據,並讓剩下的機器來保存文件的內容。設計

NameNode和DataNode是HDFS的兩個主要組件。其中,元數據存儲在NameNode上,而數據存儲在DataNode的集羣上。NameNode不只要管理存儲在HDFS上內容的元數據,並且要記錄一些事情,好比哪些節點是集羣的一部分,某個文件有幾份副本等。它還要決定當集羣的節點宕機或者數據副本丟失的時候系統須要作什麼。htm

存儲在HDFS上的每份數據片有多份副本(replica )保存在不一樣的服務器上。blog

在本質上,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 中的⑥)

A

              Hadoop圖1 HDFS寫過程示意圖

在分佈式文件系統的設計中,挑戰之一是如何確保數據的一致性。對於HDFS來講,直到全部要保存數據的DataNodes 確認它們都有文件的副本時,數據才被認爲寫入完成。所以,數據一致性是在寫的階段完成的。一個客戶端不管選擇從哪一個DataNode讀取,都將獲得相同的數據。

4 、HDFS讀過程

爲了理解讀的過程,能夠認爲一個文件是由存儲在DataNode上的數據塊組成的。客戶端查看以前寫入的內容的執行流程如圖2 所示,具體步驟爲:

  • 第一步:客戶端詢問NameNode它應該從哪裏讀取文件。(如圖2 中的①)
  • 第二步:NameNode發送數據塊的信息給客戶端。(數據塊信息包含了保存着文件副本的DataNode的IP地址,以及DataNode在本地硬盤查找數據塊所須要的數據塊ID. )(如圖2 中的②)
  • 第三步:客戶端檢查數據塊信息,聯繫相關的DataNode,請求數據塊。(如圖2 中的③)
  • 第四步:DataNode返回文件內容給客戶端,而後關閉鏈接,完成讀操做。

B

            圖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上。

 

原文連接:http://bigdata.idcquan.com/dsjjs/80517.shtml

相關文章
相關標籤/搜索