hdfs讀寫流程 HDFS 檔案讀寫流程

2021-10-11 08:58:38 字數 2798 閱讀 8847

開啟分布式檔案:呼叫分布式檔案 distributedfilesystem.open( ) 方法;

定址請求:從 namenode 處得到 datanode 的位址,distributedfilesystem使用 rpc 方式呼叫了namenode,namenode 返回存有該副本的datanode 位址,distributedfilesystem 返回了乙個輸入流物件(fsdatainputstream),該物件封裝了輸入流 dfsinputstream;

連線到datanode:呼叫輸入流 fsdatainputstream.read( ) 方法從而讓dfsinputstream 連線到 datanodes;

從 datanode 中獲取資料:通過迴圈呼叫 read( ) 方法,從而將資料從 datanode 傳輸到客戶端;

完成讀取,關閉連線:即呼叫輸入流 fsdatainputstream.close( );

讀的過程中,有可能失敗的原因:

要讀取的 datanode 存在故障,導致連線不上

讀取 block 時,進行 checksum 驗證不通過

這兩種情況,都會從 block 的其他備份所在的 datanode 繼續讀取資料,不過如果是 block 出問題還會上報給 namenode,namenode 會標記該 block 已經損壞,然後複製 block 達到預期設定的檔案備份數 。

客戶端呼叫 distributedfilesystem 的 create() 方法,開始建立新檔案:distributedfilesystem 建立 dfsoutputstream,產生乙個 rpc 呼叫,讓 namenode 在檔案系統的命名空間中建立這一新檔案;

namenode 接收到使用者的寫檔案的 rpc 請求後,先要執行各種檢查,如客戶是否有相關的建立許可權和該檔案是否已存在等,檢查都通過後才會建立乙個新檔案,並將操作記錄到編輯日誌,然後 distributedfilesystem會將 dfsoutputstream 物件包裝在 fsdataoutstream 例項中,返回客戶端;否則檔案建立失敗並且給客戶端拋 ioexception。

客戶端開始寫檔案:dfsoutputstream 會將檔案分割成 packets 資料報(一般為 64k),然後將這些 packets 寫到其內部的乙個叫做 data queue(資料佇列)。data queue 會向 namenode 節點請求適合儲存資料副本的 datanode 節點的列表,然後這些 datanode 之前生成乙個 pipeline 資料流管道,我們假設副本集引數被設定為 3,那麼這個資料流管道中就有 3 個 datanode 節點。

首先 dfsoutputstream 會將 packets 向 pipeline 資料流管道中的第乙個 datanode 節點寫資料,第乙個datanode 接收 packets 然後把 packets 寫向 pipeline 中的第二個節點,同理,第二個節點儲存接收到的資料然後將資料寫向 pipeline 中的第三個 datanode 節點。

dfsoutputstream 內部同樣維護另外乙個內部的寫資料確認佇列—— ack queue 。當 pipeline 中的第三個 datanode 節點將 packets 成功儲存後,該節點回向第二個 datanode 返回乙個確認資料寫成功的資訊,第二個 datanode 接收到該確認資訊後在當前節點資料寫成功後也會向 pipeline 中第乙個 datanode 節點傳送乙個確認資料寫成功的資訊,然後第乙個節點在收到該資訊後如果該節點的資料也寫成功後,會將 packets 從 ack queue 中將資料刪除。

完成寫操作後,客戶端呼叫 close() 關閉寫操作,重新整理資料;

在資料重新整理完後 namenode 後關閉寫操作流。到此,整個寫操作完成。

簡單總結如下:

客戶端呼叫 create 方法,rpc 呼叫 namenode 在命名空間中建立檔案;

namenode 做許可權和檔案存在檢查,通過則建立檔案並寫日誌,否則返回異常;

將檔案分割為資料報並寫入 data queue,向 namenode 請求將要寫入的 datanode 節點並生成乙個 pipeline;

依次向 pipeline 中的每乙個 datanode 節點寫資料;

同時維護乙個 ack queue,寫入成功則從佇列中移除;

呼叫 close 方法,重新整理資料;

關閉流。

在寫資料的過程中,如果其中乙個 datanode 節點寫失敗了會怎樣?

pipeline 資料流管道會被關閉,ack queue(確認佇列)中的 packets(資料報)會被新增到 data queue(資料佇列)的前面以確保不會發生 packets 的丟失。

在正常的 datanode 節點上的已儲存好的 block 的id版本會公升級——這樣發生故障的 datanode 節點上的block 資料會在節點恢復正常後被刪除,失效節點也會被從 pipeline 中刪除。

如果有多個節點的寫入失敗了,如果滿足了最小備份數的設定(dfs.namenode.repliction.min),寫入也將會成功,然後剩下的備份會被集群非同步的執行備份,直到滿足了備份數(dfs.replication)。

hdfs 1. 讀寫流程剖析

資料man

HDFS讀檔案流程

hdfs讀檔案流程圖如下 1 client通過filesystem.open path 方法,去與nn進行rpc通訊,nn會校驗傳入的路徑是否存在,使用者是否有許可權訪問該路徑下的檔案。2 校驗完成後,返回部分或者全部的block列表。其實就是返回fsdatainputstream物件。3 clie...

hdfs讀寫流程 HDFS 讀寫流程(詳解)

hdfs hadoop distributed file system 是gfs的開源實現。1 優點 因為有多個副本,可以保證資料可靠,容錯性高 計算向資料移動,適用於批處理 適合大資料處理,gb tb pb級資料,百萬以上的檔案,十萬以上的節點 可以構建在廉價機器上,通過多副本提高可靠性 2 缺點...

HDFS檔案讀寫流程

詳細步驟解析 1 client發起檔案上傳請求,通過rpc與namenode建立通訊,namenode檢查目標檔案是否已存在,父目錄是否存在,返回是否可以上傳 2 client請求第乙個block該傳輸到哪些datanode伺服器上 3 namenode根據配置檔案中指定的備份數量及機架感知原理進行...