客戶端寫資料到HDFS

2021-07-06 10:33:22 字數 1693 閱讀 9298

1、客戶端通過對 distributed filesystem 物件呼叫 create() 函式來建立檔案(步驟 1)。

2、distributedfilesystem對namenode 建立乙個 rpc 呼叫,在檔案系統的命名空間中建立乙個新檔案,此時該檔案中還沒有相應的資料塊(步驟2)。

namenode 執行各種不同的檢查以確保這個檔案不存在,並且客戶端有建立該檔案的許可權。如果這些檢查均通過, namenode 就會為建立新檔案記錄一條記錄,否則,檔案建立失敗並向客戶端丟擲乙個ioexception 異常。

distributed filesystem向客戶端返回乙個fsdataoutputstream物件,由此客戶端可以開始寫入資料。就像讀取事件一樣,fsdataoutputstream 封裝乙個 dfsoutputstream 物件,該物件負責處理 datanode與namenode 之間的通訊。

3、在客戶端寫入資料時(步驟 3),dfsoutputstream 將它分成乙個個的資料報,並寫入內部佇列,稱為」資料佇列」 (data queue)。

4、datastreamer 處理資料佇列,它的責任是根據 datanode 列表來要求 namenode 分配適合的新塊來儲存資料備份。這一組datanode 構成乙個管線一一假設複本數為3,所以管線中有3個節點。datastreamer 將資料報流式傳輸到管線中第1個datanode ,該 datanode 儲存資料報並將它傳送到管線中的第2個datanode 。同樣地,第2個datanode 儲存該資料報並且傳送給管線中的第3個(也是最後乙個 )datanode (步驟4)。

5、dfsoutputstream 也維護著乙個內部資料報佇列來等待 datanode 的收到確認回執,稱為」確認佇列」 (ack queue) 。當收到管道中所有 datanode 確認資訊後,該資料報才會從確認佇列刪除(步驟 5)。

如果在資料寫入期間, datanode 發生故障,則執行以下操作,這對與寫入資料的客戶端是透明的。首先關閉管線,確認把佇列中的任何資料報都新增回資料佇列的最前端,以確保故障節點下游的 datanode 不會漏掉任何乙個資料報。為儲存在另一正常 datanode 的當前資料塊指定乙個新的標識,並將該標識傳送給 namenode,以便故障 datanode 在恢復後可以刪除儲存的部分資料塊。從管線中刪除故障資料節點並且把餘下的資料塊寫入管線中的兩個正常的 datanode。 namenode 注意到塊複本量不足時,會在另乙個節點上建立乙個新的複本。後續的資料塊繼續正常接受處理。

在乙個塊被寫入期間可能會有多個 datanode 同時發生故障,但非常少見。只要寫入了 dfs.replication.min 的複本數(預設為1),寫操作就會成功,並且這個塊可以在集群中非同步複製,直到達到其目標複本數 (dfs. replication 的預設值3)。

6、客戶端完成資料的寫入後,會對資料流呼叫 close()方法(步驟 6) 。

7、close()方法會將剩餘的所有資料報寫入 datanode 管線中,並在聯絡 namenode 且傳送檔案寫入完成訊號之前,等待確認(步驟 7)。namenode 已經知道檔案由哪些塊組成(通過 datastreamer詢問資料塊的分配) ,所以它在返回成功前只需要等待資料塊進行最小量的複製。

客戶端讀寫資料到HDFS的流程

1 客戶端發出寫資料請求,hadoop fs put localfile.txt hdfsfile.txt 本地的localfile.txt檔案大小是170mb,而hdfs預設的block大小是128mb,因此這個檔案將會被分成兩個block 2 namenode首先檢查這個檔案在hdfs中是否存在...

hdfs客戶端操作

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

hdfs客戶端操作

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