客戶端或者使用者通過呼叫 filesystem 物件的 open()方法開啟需要讀取的檔案,這對 hdfs 來說是常見乙個分布式檔案系統的乙個讀取例項。
filesystem 通過遠端協議呼叫 namenode 確定檔案的前幾個 block 的位置。對於每乙個 block, namenode 返回一含有那個 block 拷貝的「元資料」,即檔案基本資訊;接下來,datanode 按照上文定義的距離值進行排序,如果 client 本身就是乙個 datanode,那麼優先從本地 datanode 節點讀取資料。 hdfs 例項做完以上工作後,返回乙個 fsdatainputstream給客戶端,讓其從 fsdatainputstream 中讀取資料。 fsdatainputstream 接著包裝乙個dfsinputstream,用來管理 datanode 和 namenode 的 i/o。
namenode 向客戶端返回乙個包含資料資訊的位址,客戶端根據位址建立乙個fsdatainputstream 開始對資料進行讀取。
fsdatainputstream 根據開始時存放的前幾個 blocks 的 datanode 的位址,連線到最近的 datanode 上對資料開始從頭讀取。客戶端反覆呼叫 read()方法,以流式方式從datanode 讀取資料。
當讀到 block 的結尾的時候, fsdatainputstream 會關閉到當前 datanode 的鏈結,然後查詢能夠讀取下乙個 block 的最好的 datanode。這些操作對客戶端是透明的,客戶端感覺到的是連續的流,也就說讀取的時候就開始查詢下乙個塊所在的位址。
讀取完成呼叫 close()方法,關閉 fsdatainputstream。
以上就是 hdfs 對資料進行讀取的整個流程。
對於錯誤處理來說,在讀取期間,當 client 與 datanode 通訊的時候如果發生錯誤的話,它會嘗試讀取下個緊接著的含有那個 block 的 datanode。 client 會記住發生錯誤的 datanode,這樣它就不必在讀取以後的塊的時候再嘗試這個 datanode 了。 client 也驗證從 datanode 傳遞過來的資料的 checksum。如果錯誤的 block 被發現,它將嘗試從另乙個 datanode 讀取資料前被報告給 namenode。
ps:namenode 中存放的是元資料,即將資料型別、大小、格式以物件的形式存放在 namenode 記憶體中。便於加快讀取速度。
HDFS 檔案讀取過程
client向namenode發起rpc請求,來確定請求檔案block所在的位置 namenode會視情況返回檔案的部分或者全部block的主機列表,namenode會對列表進行排序,排序兩個規則 網路拓撲結構中距離 client 近的排靠前 心跳機制中超時匯報的 dn 狀態為 stale,這樣的排...
hdfs的寫入過程和讀取過程
1 客戶端 client 發出請求 將請求發給namenode 要將大小為300m的a.txt檔案上傳到 根目錄下 a.txt 2 namenode對收到的請求做出檢測 檢測1 所上傳的路徑下是否存在該檔案,即根目錄下是否有a.txt 檢測2 檢測客戶端是否有上傳許可權 3 檢測通過,反饋給客戶端 ...
hdfs檔案寫入與讀取過程
client向namenode請求上傳a.txt namenode檢測client的上傳許可權 namenode回答client是否可以上傳 client將檔案按照block size大小將檔案分為幾份,並向namenode請求上傳乙個block namenode根據datanode上的block資...