HDFS讀寫流程

數據讀取流程:

  1. 客戶端訪問NameNode,告知需要讀取的文件

  2. 客戶身份確認

    1. 通過信任的客戶端。由其指定用戶名

    2. 通過諸如kerberos等強制認證機制完成

  3. 檢查文件的所有者及其設定的訪問權限,如果文件確實存在,而且用戶對這個有訪問權限。NameNode告知客戶端文件的第一個數據塊的標號以及保存該數據塊的DataNode列表(列表是根據DataNode與客戶端間的距離排序的,距離是根據Hadoop集羣的機架拓撲結構計算得到的)

  4. 客戶端根據數據塊標號和DataNode主機名,訪問最合適的DataNode,讀取所需要的數據塊,直到所有數據塊讀取完成或客戶端主動關閉了文件流


異常情況:

  1. 從DataNode讀取數據時,進程或主機異常。此時讀操作不會停止,HDFS庫會自動嘗試從其他有數據副本的DataNode中讀取數據。如果所有數據副本都無法訪問,則讀取操作失敗,客戶端收到異常出錯消息

  2. 當客戶端試圖從DataNode中讀取數據時,NameNode返回的數據塊位置信息已過期。這時若還有其他DataNode保存該數據塊副本,則客戶端會嘗試從那些DataNode中讀取數據,否則至此讀取操作會失敗


數據寫入流程:

  1. 客戶端通過hadoop文件系統相關api發送請求打開一個要寫入的文件,若該用戶有足夠的權限,請求送抵NameNode,在NameNode上建立該文件的元數據

  2. 客戶端收到“打開文件成功”的響應

  3. 客戶端將數據寫入流,數據會自動拆分成數據包,並將數據包保存在內存隊列中

  4. 客戶端的獨立線程從隊列中讀取數據包,同時向NameNode請求一組DataNode列表,以便寫入數據塊的多個副本

  5. 客戶端直接連接列表中的第一個DataNode,該DataNode又連接到第二個DataNode,第二個又連接第三個,建立數據塊的複製管道

  6. 數據包以流的方式寫入第一個DataNode的磁盤,同時傳入管道中的下一個DataNode並寫入其磁盤,以此類推

  7. 複製管道中的每個DataNode都會確認所收到數據包已成功寫入磁盤

  8. 客戶端維護一張列表,記錄哪些數據包尚未收到確認消息,每收到一個響應,客戶端便知道數據已成功寫入到管道中的一個DataNode

  9. 當數據塊被寫滿時,客戶端將重新向NameNode申請下一組DataNode

  10. 客戶端將剩餘數據包全部寫入磁盤,關閉數據流並通知NameNode文件寫操作已完成


異常情況:

複製管道中的某一個DataNode無法將數據寫入磁盤,管道立即關閉。已發送的但尚未收到確認的數據包會被回退到隊列中,以確保管道中錯誤節點的下游節點可以獲得數據包。在剩下的健康數據節點中,正在寫入的數據塊被分配新的ID。當發生故障的數據節點恢復後,冗餘的數據塊貌似不屬於任何文件而自動丟棄,由剩餘節點組成的新複製管道會重新開放,繼續寫操作直至文件關閉

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