HDFS讀寫流程

2021-09-02 08:20:22 字數 2878 閱讀 9865

hdfs讀寫流程

一: hdfs讀檔案流程

1:client通過filesystem.open(filepath)方法,去與namenode進行rpc通訊,返回該檔案的部分或全部的block列表( 也包含該列表各 block 的分布在 datanode 位址的列表),也就是返回fsdatainputstream物件;

2:client呼叫fsdatainputstream物件的read()方法,

a. 去與第乙個塊的最近的datanode進行read,讀取完後,會check(審核),假如successful(審核通過),會關閉與當前datanode通訊;(假如check fail(審核失敗),會記錄失敗的塊+datanode資訊,下次就不會讀取;那麼會去該塊的第二個

datanode位址讀取)

b. 然後去第二個塊的最近的datanode上的進行讀取,check後,會關閉與datanode的通訊。

c. 假如block列表讀取完了,檔案還未結束,那麼filesystem會從namenode獲取下一批的block的列表。

3:client呼叫fsdatainputstream.close()方法,關閉輸入流.

下面是流程圖:

二:hdfs寫檔案流程

1:client呼叫filesystem.create(filepath)方法,去與namenode進行rpc通訊, check 該路徑的檔案是否存在以及有沒有許可權建立該檔案,假如ok,就建立乙個新檔案,但是並不關聯任何block,返回乙個fsdataoutputstream物件;(假如not ok,就返回錯誤資訊)

2:client呼叫fsdataoutputstream物件的write()方法,會將第乙個塊寫入第乙個datanode,第乙個datanode寫完傳給第二個節點,第二個寫完傳給第三節點,當第三個節點寫完返回乙個ack packet給第二個節點,第二個返回乙個ack packet給第乙個節點,第乙個節點返回ack packet給fsdataoutputstream物件,意思標識第乙個塊寫完,副本數為3;然後剩餘的塊依次這樣寫;

3:當向檔案寫入資料完成後,client呼叫fsdataoutputstream.close()方法,關閉輸出流,flush快取區的資料報;

4:再呼叫filesystem.complete()方法,告訴namenode節點寫入成功。

下面是流程圖:

總之:hdfs寫資料的流程:

1、hdfs會去呼叫distributedfilesystem,呼叫其上的create()方法,去namenode上建立檔案。

2、distributedfilesystem 會對namenode建立乙個ppc呼叫,在檔案系統的空間中新建乙個檔案,此檔案中還有相應的資料塊,namenode會執行各種檢查,以確保這個檔案不存在以及客戶端具有可執行的許可權。如果檢查均通過了,namenode會為建立檔案記錄一條新的記錄。否則檔案建立失敗,並向客戶端報出乙個ioexception異常。distributedfilesystem會向客戶端返回fsdataoutputstream,該物件中封裝了dfsoutputstream,這個物件可以和namenode以及datanode建立聯絡。

3、在客戶端寫入資料時,dfsoutputstream會將它分成乙個個的資料報,並寫入內部對列,稱為「資料佇列」 中。

4、datastreamer處理資料地列,他的責任就是根據datanode中的列表要求,去namenode中申請分配新塊來儲存副本。這一組datanode構成了乙個管線,假如有3個datanode,datastreamer將資料傳送給管線中的第一datanode,然後傳送給第二個datanode,第三個datanode。

5、dfsoutputdtream也會維護著乙個內部資料報佇列等待datanode收到確認回執,收到管道中的確認回執之後,該資料報才會從確認佇列中刪除。

6、客戶端完成資料的寫入之後,會對資料流呼叫close方法,該操作將所有的包寫入到datanode中。

7、dfsoutputstream等待確認回執,如果收到了確認回執,namenode就已經知道檔案由哪些塊組成。

讀取檔案是這樣的:

1、hdfs呼叫distributedfilesystem,呼叫其上的open方法,開啟檔案 

2、distributedfilesysytem通過遠端rpc來呼叫namenode,以確定檔案的位置,對於每乙個塊,namenode返回該快的起始的副本的datanode的位址,這些datanode根據 他們與客戶端之間的距離來排序,保證客戶端首先讀到距離最近的資料,如果客戶端本身就是乙個datanode,並且儲存有相同的資料塊的副本,該節點會從本地datanode讀取資料,distribute的filesystem返回給客戶端乙個fsdatainputstream物件,該物件支援檔案定位的輸入流。fsdatainputstream類轉而封裝成dfsinputstream物件,該物件管理著datanode和namenode的i/o

3、客戶端對這個輸入流呼叫read方法,儲存著檔案起始塊幾個塊的datanode位址的dfsinputstream,隨機連線距離最近的datanode,通過對資料流反覆呼叫read方法,可以將資料從datanode傳輸到客戶端。

4、到大塊的末端的時候,dfsinputstream關閉與該datanode的連線

5、尋找下乙個最佳的datanode

6、客戶端從流中讀取資料時,開啟dfsinputstream與datanode新建連線,從流中順序讀取。一旦客戶端完成讀取,就對fsdatainputstream呼叫close方法。

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

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

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

開啟分布式檔案 呼叫分布式檔案 distributedfilesystem.open 方法 定址請求 從 namenode 處得到 datanode 的位址,distributedfilesystem使用 rpc 方式呼叫了namenode,namenode 返回存有該副本的datanode 位址,...

hdfs讀寫流程

1.client發起檔案上傳請求 通過rpc和namenode建立連線,namenode檢查目標檔案是否存在,檢查父目錄是否存在,檢查使用者是否有許可權,返回是否可以上傳 2.client請求第乙個block該傳輸到那些datanode伺服器上 3.namenode根據配置檔案中指定的備份數量及機架...