主要流程如下圖所示
8. hdfs主要流程之客戶端讀流程.png
分為如下幾個步驟
開啟hdfs檔案
hdfs客戶端首先呼叫distributedfilesystem.open()方法開啟hdfs檔案,這個方法在底層會呼叫dfsclient.open()方法,該方法會返回乙個hdfsdatainputstream物件用於讀取資料塊。hdfsdatainputstream其實是乙個dfsinputstream的裝飾類,真正進行資料塊讀取操作的是dfsinputstream物件
從namenode獲取datanode位址
在dfsinputstream的構造方法中,會呼叫clientprotocol.getlocatedblocks()方法向namenode獲取該hdfs檔案起始位置資料塊的位置資訊,namenode返回的資料塊的儲存位置是按照與客戶端的距離遠近排序的,所以dfsinputstream可以選擇乙個最優的datanode節點,然後與這個節點建立連線讀取資料塊
連線到datanode讀取資料塊
hdfs 客戶端通過呼叫dfsinputstream.read()方法從這個最優的datanode讀取資料塊,資料會議資料報(packet)為單位從datanode通過流式介面傳輸到客戶端。當達到乙個資料塊的末尾時,dfsinputstream就會再次呼叫clientprotocol.getlocatedblocks()獲取檔案下乙個資料塊的位置資訊,並建立和這個新的資料塊的最優節點之間的連線,然後hdfs客戶端就可以繼續讀取資料塊了。
關閉輸入流
當客戶端成功完成檔案讀取後,會通過hdfsdatainputstream.close()方法關閉輸入流。
客戶端讀取資料塊時,很有可能儲存這個資料塊的datanode出現異常,也就是無法讀取資料。出現這種情況時,dfsinputstream會切換到另乙個儲存了這個資料塊副本的datanode,然後讀取資料,同時,資料塊的應答包中不僅包含了資料,還包含了校驗值。hdfs客戶端接收到資料應答包時,會對資料進行校驗,如果出現校驗錯誤,也就是datanode上的這個資料塊副本出現了損壞,hdfs客戶端會通過clientprotocol.reportbadblocks()向namenode匯報這個損壞的資料塊副本,同時dfsinputstream會嘗試從其他datanode讀取這個資料塊。
09 HDFS主要流程之客戶端追加資料流程
客戶端除了可以執行寫入新的hdfs檔案操作外,還可以開啟乙個已有檔案並執行追加寫操作,下面是追加寫的幾個步驟 開啟已有的hdfs檔案 建立資料流管道 通過資料流管道寫入資料 成功地建立資料流管道後,hdfs客戶端就可以向資料流管道寫資料了,這部分內容與上篇寫hdfs檔案流程類似 關閉輸入流並提交檔案...
HDFS客戶端讀寫流程及checkpoint
1 客戶端請求上傳資料到伺服器 2 伺服器接收到這個請求,然後到自己的元資料裡面去查詢,元資料中是否記錄了該檔案的存在 3 nn響應客戶端是否可以上傳 4 伺服器會傳送再次請求,需要上傳多大的資料檔案 5 伺服器會檢查datanode的資訊 6 伺服器會根據上傳檔案大小進行排程,排程出最合適的dat...
hdfs客戶端操作
hdfs的客戶端有多種形式 網頁形式 命令列形式 客戶端在 執行,沒有約束,只要執行客戶端的機器能夠跟hdfs集群聯網 檔案的切塊大小和儲存的副本數量,都是由客戶端決定!所謂的由客戶端決定,是通過配置引數來定的 hdfs的客戶端會讀以下兩個引數,來決定切塊大小 副本數量 切塊大小的引數 dfs.bl...