數據讀取流程:
客戶端訪問NameNode,告知需要讀取的文件
客戶身份確認
通過信任的客戶端。由其指定用戶名
通過諸如kerberos等強制認證機制完成
檢查文件的所有者及其設定的訪問權限,如果文件確實存在,而且用戶對這個有訪問權限。NameNode告知客戶端文件的第一個數據塊的標號以及保存該數據塊的DataNode列表(列表是根據DataNode與客戶端間的距離排序的,距離是根據Hadoop集羣的機架拓撲結構計算得到的)
客戶端根據數據塊標號和DataNode主機名,訪問最合適的DataNode,讀取所需要的數據塊,直到所有數據塊讀取完成或客戶端主動關閉了文件流
異常情況:
從DataNode讀取數據時,進程或主機異常。此時讀操作不會停止,HDFS庫會自動嘗試從其他有數據副本的DataNode中讀取數據。如果所有數據副本都無法訪問,則讀取操作失敗,客戶端收到異常出錯消息
當客戶端試圖從DataNode中讀取數據時,NameNode返回的數據塊位置信息已過期。這時若還有其他DataNode保存該數據塊副本,則客戶端會嘗試從那些DataNode中讀取數據,否則至此讀取操作會失敗
數據寫入流程:
客戶端通過hadoop文件系統相關api發送請求打開一個要寫入的文件,若該用戶有足夠的權限,請求送抵NameNode,在NameNode上建立該文件的元數據
客戶端收到“打開文件成功”的響應
客戶端將數據寫入流,數據會自動拆分成數據包,並將數據包保存在內存隊列中
客戶端的獨立線程從隊列中讀取數據包,同時向NameNode請求一組DataNode列表,以便寫入數據塊的多個副本
客戶端直接連接列表中的第一個DataNode,該DataNode又連接到第二個DataNode,第二個又連接第三個,建立數據塊的複製管道
數據包以流的方式寫入第一個DataNode的磁盤,同時傳入管道中的下一個DataNode並寫入其磁盤,以此類推
複製管道中的每個DataNode都會確認所收到數據包已成功寫入磁盤
客戶端維護一張列表,記錄哪些數據包尚未收到確認消息,每收到一個響應,客戶端便知道數據已成功寫入到管道中的一個DataNode
當數據塊被寫滿時,客戶端將重新向NameNode申請下一組DataNode
客戶端將剩餘數據包全部寫入磁盤,關閉數據流並通知NameNode文件寫操作已完成
異常情況:
複製管道中的某一個DataNode無法將數據寫入磁盤,管道立即關閉。已發送的但尚未收到確認的數據包會被回退到隊列中,以確保管道中錯誤節點的下游節點可以獲得數據包。在剩下的健康數據節點中,正在寫入的數據塊被分配新的ID。當發生故障的數據節點恢復後,冗餘的數據塊貌似不屬於任何文件而自動丟棄,由剩餘節點組成的新複製管道會重新開放,繼續寫操作直至文件關閉