客戶端讀取HDFS中的數據

以下內容摘自《Hadoop權威指南》,版權歸原作者所有。

流程圖

這裏寫圖片描述

流程說明

1、客戶端通過調用 FileSyste 對象的 open() 方法來打開希望讀取的文件,對於HDFS 來說,這個對象是分佈式文件系統的一個實例(步驟 1) 。

2、DistributedFileSystem 通過使用 RPC 來調用 namenode ,以確定文件起始塊的位置(步驟 2) 。

對於每一個塊, namenode 返回存有該塊複本的 datanode 地址。此外,這些 datanode 根據它們與客戶端的距離來排序(機架感應)。如果該客戶端本身就是一個 datanode(比如,在一個 MapReduce 任務中) ,並保存有相應數據塊的一個複本時,該節點將從本地 datanode 中讀取數據。

3、DistributedFileSystem 類返回一個 FSDatalnputStream 對象(一個支持文件定位的輸入流)給客戶端並讀取數據。 FSDatalnputStream 類轉而封裝DFSlnputStream 對象,該對象管理着 datanode 、namenode 的I/O。接着,客戶端對這個輸入流調用 read() 方法(步驟 3) 。

4、存儲着文件起始塊的datanode 地址的 DFSlnputStream 隨即連接距離最近的 datanode 。通過對數據流反覆調用 read() 方法,可以將數據從 datanode 傳輸到客戶端(步驟4)。

5、到達塊的末端時, DFSlnputStream 會關閉與該 datanode 的連接,然後尋找下一個塊的最佳datanode (步驟 5) 。

客戶端只需要讀取連續的流,井且對於客戶端都是透明的。
客戶端從流中讀取數據時,塊是按照打開 DFSlnputStream與 datanode 新建連接的順序讀取的。它也需要詢問 namenode 來檢索下一批所需塊的 datanode 的位置。

6、一且客戶端完成讀取,就對 FSDatalnputStream 調用 close() 方法(步驟 6)。

在讀取數據的時候,如果 DFSlnputStream在與datanode通信時遇到錯誤,它便會嘗試從這個塊的另外一個最鄰近 datanode 讀取數據 。它也會記住那個故障datanode ,以保證以後不會反覆讀取該節點上後續的塊。DFSlnputStream也會通過校驗和確認從 datanode 發來的數據是否完整。如果發現一個損壞的塊,它就會在DFSlnputStream試圖從其他 datanode 讀取一個塊的複本之前通知 namenode。

這個設計的一個重點是 namenode 告知客戶端每個塊中最佳的 datanode ,並讓客戶端直接聯繫該 datanode 且檢索數據。由於數據流分散在該集羣中的所有datanode ,所以這種設計能使 HDFS 可擴展到大量的併發客戶端。同時,namenode 僅需要響應塊位置的請求(這些信息存儲在內存中,因而非常高效) ,而無需晌應數據請求,否則隨着客戶端數量的增長, namenode 很快會成爲一個瓶頸。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章