Hadoop之HDFS存儲及讀取機制

什麼是HDFS?

首先HDFS稱爲分佈式文件系統,是一個高容錯性的系統。
分佈式文件系統,首先其中有幾點。分別是:

  • 分佈式。
  • 文件。
  • 系統

即橫跨在多臺計算機上的同一個文件存儲系統。存儲在分佈式文件系統上的數據自動分佈在不同的節點上。
由於是分佈式文件系統,所以元數據與數據文件是分離存儲的

  • NameNode
  • DataNode

在傳統的文件系統裏,因爲文件系統不會跨越多臺機器,元數據和數據存儲在同一臺機器上。
爲了構建一個分佈式文件系統,讓客戶端在這種系統中使用簡單,並且不需要知道其他客戶端的活動,那麼元數據需要在客戶端以外維護。HDFS的設計理念是拿出一臺或多臺機器來保存元數據,並讓剩下的機器來保存文件的內容。
存儲在HDFS上的每份數據片有多份副本(replica)保存在不同的服務器上。在本質上,NameNode是HDFS的Master(主服務器),DataNode是Slave(從服務器)。

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

HDFS寫入過程

NameNode負責管理存儲在HDFS上所有文件的元數據,它會確認客戶端的請求,並記錄下文件的名字和存儲這個文件的DataNode集合。它把該信息存儲在內存中的文件分配表裏。
例如,客戶端發送一個請求給NameNode,說它要將“demo.txt”文件寫入到HDFS。那麼,其執行流程如圖1所示。具體爲:
第一步:客戶端發消息給NameNode,說要將“demo.txt”文件寫入。(如圖1中的①)
第二步:NameNode發消息給客戶端,叫客戶端寫到DataNode A、B和D,並直接聯繫DataNode B。(如圖1中的②)
第三步:客戶端發消息給DataNode B,叫它保存一份“demo.txt”文件,並且發送一份副本給DataNode A和DataNode D。(如圖1中的③)
第四步:DataNode B發消息給DataNode A,叫它保存一份“demo.txt”文件,並且發送一份副本給DataNode D。(如圖1中的④)
第五步:DataNode A發消息給DataNode D,叫它保存一份“demo.txt”文件。(如圖1中的⑤)
第六步:DataNode D發確認消息給DataNode A。(如圖1中的⑤)
第七步:DataNode A發確認消息給DataNode B。(如圖1中的④)
第八步:DataNode B發確認消息給客戶端,表示寫入完成。(如圖1中的⑥)

這裏寫圖片描述

Configuration conf = new Configuration();  
FileSystem fs = FileSystem.get(conf);  
Path file = new Path("demo.txt");  
FSDataOutputStream outStream = fs.create(file);  
outStream.writeUTF("Welcome to HDFS Java API!!!");  
outStream.close();  

HDFS寫入過程

爲了理解讀的過程,可以認爲一個文件是由存儲在DataNode上的數據塊組成的。客戶端查看之前寫入的內容的執行流程如圖2所示,具體步驟爲:
第一步:客戶端詢問NameNode它應該從哪裏讀取文件。(如圖2中的①)
第二步:NameNode發送數據塊的信息給客戶端。(數據塊信息包含了保存着文件副本的DataNode的IP地址,以及DataNode在本地硬盤查找數據塊所需要的數據塊ID。) (如圖2中的②)
第三步:客戶端檢查數據塊信息,聯繫相關的DataNode,請求數據塊。(如圖2中的③)
第四步:DataNode返回文件內容給客戶端,然後關閉連接,完成讀操作。(如圖2中的④)
這裏寫圖片描述
客戶端並行從不同的DataNode中獲取一個文件的數據塊,然後聯結這些數據塊,拼成完整的文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章