HDFS讀取流程和寫流程

2021-08-28 05:57:11 字數 1775 閱讀 3045

讀:1.客戶端或者使用者通過呼叫 filesystem 物件的 open()方法開啟需要讀取的檔案,這對 hdfs 來說是常見乙個分布式檔案系統的乙個讀取例項。

2.filesystem 通過遠端協議呼叫 namenode 確定檔案的前幾個 block 的位置。對於每乙個 block, namenode 返回一含有那個 block 拷貝的「元資料」,即檔案基本資訊;接下來,datanode 按照上文定義的距離值進行排序,如果 client 本身就是乙個 datanode,那麼優先從本地 datanode 節點讀取資料。 hdfs 例項做完以上工作後,返回乙個 fsdatainputstream給客戶端,讓其從 fsdatainputstream 中讀取資料。 fsdatainputstream 接著包裝乙個dfsinputstream,用來管理 datanode 和 namenode 的 i/o。

3.namenode 向客戶端返回乙個包含資料資訊的位址,客戶端根據位址建立乙個fsdatainputstream 開始對資料進行讀取。

4.fsdatainputstream 根據開始時存放的前幾個 blocks 的 datanode 的位址,連線到最近的 datanode 上對資料開始從頭讀取。客戶端反覆呼叫 read()方法,以流式方式從datanode 讀取資料。

5.當讀到 block 的結尾的時候, fsdatainputstream 會關閉到當前 datanode 的鏈結,然後查詢能夠讀取下乙個 block 的最好的 datanode。這些操作對客戶端是透明的,客戶端感覺到的是連續的流,也就說讀取的時候就開始查詢下乙個塊所在的位址。

讀取完成呼叫 close()方法,關閉 fsdatainputstream。

1.client 通過呼叫 filesystem 的 create()方法來請求建立檔案

2.filesystem 通過對 namenode 發出遠端請求,在 namenode 裡面建立乙個新的檔案,但此時並不關聯任何的塊。 namenode 進行很多檢查來保證不存在要建立的檔案已經存在於檔案系統中,同時檢查是否有相應的許可權來建立檔案。如果這些檢查都完成了,那麼namenode 將記錄下來這個新檔案的資訊。 filesystem 返回乙個 fsdataoutputstream 給客戶端用來寫入資料。和讀的情形一樣, fsdataoutputstream 將包裝乙個 dfsoutputstream 用於和 datanode 及 namenode 通訊。而一旦檔案建立失敗,客戶端會收到乙個 ioexpection,標示檔案建立失敗,停止後續任務。

3.客戶端開始寫資料。 fsdataoutputstream 把要寫入的資料分成包的形式,將其寫入到中間佇列中。其中的資料由 datastreamer 來讀取。 datastreamer 的職責是讓 namenode分配新的塊——通過找出合適的 datanode——來儲存作為備份而複製的資料。

4.fsdataoutputstream 維護了乙個內部關於 packets 的佇列,裡面存放等待被datanode 確認無誤的 packets 的資訊。這個佇列稱為等待佇列。乙個 packet 的資訊被移出本佇列當且僅當 packet 被所有節點都確認無誤

5.當完成資料寫入之後客戶端呼叫流的 close 方法,在通知 namenode 完成寫入之前,這個方法將 flush 殘留的 packets,並等待確認資訊。 namenode 已經知道檔案由哪些塊組成,所以它在返回成功前只需要等待資料塊進行最小值複製。

HDFS 讀取流程

先看圖 hdfs客戶端要讀取資料首先必須和namenode 建立連線,獲取datanode資訊。namenode會根據客戶端的實體地址返回乙個由近到遠的塊位址列表。客戶端拿到列表後和最近的進行連線讀取資料 hdfs中塊是由乙個完整的檔案分成多個塊,而每個塊可能儲存在不同機架上。每個塊中除了資料還儲存...

HDFS寫檔案流程

hdfs寫入檔案流程圖如下 1 客戶端呼叫distributed filesystem.create path 方法,與namenode進行rpc通訊,引數為路徑path。檢查傳入的路徑是否存在,以及當前使用者是否有寫入許可權。假如都滿足,就建立乙個新的檔案,但是此時並不關聯任何的block。並且返...

HDFS 寫檔案流程

hdfs寫檔案流程,需要先看懂下面2張圖 如圖 有2個機架伺服器群,通過交換機進行互動,其中同乙個群的不同機架都通過群內的伺服器進行互動。例子中設定的3個副本放置在2個機架服務群上,其中副本1,2絕對不在同乙個機架群。這是為了防止有人把副本設定為2,然後a1,a2都分配到乙個機架服務群。假設乙個資料...