Hadoop之HDFS文件讀寫流程(超詳細!!!!)

HDFS文件寫入過程:

以客戶端爲中心輸出數據到datanode

詳細步驟解析:

1、 client發起文件上傳請求,通過RPC與NameNode建立通訊,NameNode檢查目標文件是否已存在,父目錄是否存在,返回是否可以上傳;
2、 client請求第一個block該傳輸到哪些DataNode服務器上;
3、 NameNode根據配置文件中指定的備份數量及機架感知原理進行文件分配,返回可用的DataNode的地址如:A,B,C;

4、 client請求3臺DataNode中的一臺A上傳數據(本質上是一個RPC調用,建立pipeline),A收到請求會繼續調用B,然後B調用C,將整個pipeline建立完成,後逐級返回client;
5、 client開始往A上傳第一個block(先從磁盤讀取數據放到一個本地內存緩存),以packet爲單位(默認64K),A收到一個packet就會傳給B,B傳給C;A每傳一個packet會放入一個應答隊列等待應答。
6、 數據被分割成一個個packet數據包在pipeline上依次傳輸,在pipeline反方向上,逐個發送ack(命令正確應答),最終由pipeline中第一個DataNode節點A將pipelineack發送給client;
7、關閉寫入流。
8、 當一個block傳輸完成之後,client再次請求NameNode上傳第二個block到服務器。

HDFS文件讀取過程:

以客戶端爲中心讀取數據

詳細步驟解析

1、客戶端通過調用FileSystem對象的open()來讀取希望打開的文件。
2、 Client向NameNode發起RPC請求,來確定請求文件block所在的位置;
3、 NameNode會視情況返回文件的部分或者全部block列表,對於每個block,NameNode 都會返回含有該 block 副本的 DataNode 地址; 這些返回的 DN 地址,會按照集羣拓撲結構得出 DataNode 與客戶端的距離,然後進行排序,排序兩個規則:網絡拓撲結構中距離 Client 近的排靠前;心跳機制中超時彙報的 DN 狀態爲 STALE,這樣的排靠後;
4、 Client 選取排序靠前的 DataNode 來讀取 block,如果客戶端本身就是DataNode,那麼將從本地直接獲取數據(短路讀取特性);
5、 底層上本質是建立 Socket Stream(FSDataInputStream),重複的調用父類 DataInputStream 的 read 方法,直到這個塊上的數據讀取完畢;
6、並行讀取,若失敗重新讀取
7、 當讀完列表的 block 後,若文件讀取還沒有結束,客戶端會繼續向NameNode 獲取下一批的 block 列表;
8、返回後續block列表
9、 最終關閉讀流,並將讀取來所有的 block 會合併成一個完整的最終文件。
說明:
1、讀取完一個 block 都會進行 checksum 驗證,如果讀取 DataNode 時出現錯誤,客戶端會通知 NameNode,然後再從下一個擁有該 block 副本的DataNode 繼續讀。
2、read 方法是並行的讀取 block 信息,不是一塊一塊的讀取;NameNode 只是返回Client請求包含塊的DataNode地址,並不是返回請求塊的數據;

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