客戶端讀取HDFS中的資料

2021-07-06 10:30:09 字數 1532 閱讀 8640

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 很快會成為乙個瓶頸。

hdfs客戶端操作

hdfs的客戶端有多種形式 網頁形式 命令列形式 客戶端在 執行,沒有約束,只要執行客戶端的機器能夠跟hdfs集群聯網 檔案的切塊大小和儲存的副本數量,都是由客戶端決定!所謂的由客戶端決定,是通過配置引數來定的 hdfs的客戶端會讀以下兩個引數,來決定切塊大小 副本數量 切塊大小的引數 dfs.bl...

hdfs客戶端操作

這裡hdfs客戶端指的是eclipse 一 獲取hadoop安裝包解壓後進入share資料夾裡面的所有jar包 二 這裡如果你客戶端 eclipse所在機器 是win7,需要編譯hadoop原始碼來適應你的機器。三 配置hadoop home環境變數和path 四 拷貝win7電腦上的檔案到虛擬機器...

客戶端寫資料到HDFS

1 客戶端通過對 distributed filesystem 物件呼叫 create 函式來建立檔案 步驟 1 2 distributedfilesystem對namenode 建立乙個 rpc 呼叫,在檔案系統的命名空間中建立乙個新檔案,此時該檔案中還沒有相應的資料塊 步驟2 namenode ...