好程序員大數據分享修行寶典-HDFS讀寫兩步教程

好程序員大數據分享修行寶典-HDFS讀寫兩步教程

好程序員大數據分享修行寶典-HDFS讀寫兩步教程

一、HDFS讀寫之前提

NameNode(元數據節點):存放元數據(名稱空間、副本數、權限、塊列表、集群配置信息),不包含數據節點。元數據節點將文件系統元數據存儲在內存中。

1.DataNode(數據節點):真正存儲數據的地方,以數據塊為單位。默認數據塊大小為128M。數據節點週期性的將所有存儲塊信息發送給元數據節點。客戶端通過和NameNode節點溝通後,再向數據節點對數據讀出或寫入。

2.SecondaryNameNode(從元數據節點):並不是元數據節點的備用節點,而是配合元數據節點工作,與元數據節點有不同的工作。SecondaryNameNode週期性地將元數據節點的命名空間鏡像文件和修改日誌合併,幫助元數據節點將內存中元數據信息存儲到磁盤上。

3.Client(客戶端):客戶端就是需要獲取HDFS系統中文件的應用程序和接口,引發HDFS的讀/寫等操作。

值得注意的是:

1.namenode實際客戶端只上傳一個datanode,其餘兩個是namenode完成的。讓datenote自己複製的。然後複製完成以後逐級返回結果給namenode。如果2,3datanode複製失敗,再有namenode分配新的datanode地址。對於客戶端來說默認上傳一個datanode就可以了,其餘的由datanode自己複製。

2.datanode切片是由客戶端完成的。datanode第二三個副本的上傳和第一個上傳是異步的。

二、HDFS中的寫流程:

1.根namenode通信請求上傳文件,namenode檢查目標文件是否已存在,父目錄是否存在。

2.namenode返回是否可以上傳。

3.client請求第一個 block該傳輸到哪些datanode服務器上。

4.namenode返回3個datanode服務器ABC。

5.client請求3臺dn中的一臺A上傳數據(本質上是一個RPC調用,建立pipeline),A收到請求會繼續調用B,然後B調用C,將真個pipeline建立完成,逐級返回客戶端。

6.client開始往A上傳第一個block(先從磁盤讀取數據放到一個本地內存緩存),以packet為單位,A收到一個packet就會傳給B,B傳給C;A每傳一個packet會放入一個應答隊列等待應答。

7.當一個block傳輸完成之後,client再次請求namenode上傳第二個block的服務器。

三、hdfs中的讀流程:

1.跟namenode通信查詢元數據,找到文件塊所在的datanode服務器。

2.挑選一臺datanode(就近原則,然後隨機)服務器,請求建立socket流。

3.datanode開始發送數據。(從磁盤裡面讀取數據放入流,以packet為單位來做校驗)

4.客戶端以packet為單位接收,先在本地緩存,然後寫入目標文件。


分享到:


相關文章: