HDFS客戶端 輸出流原始碼解析

2021-06-22 22:53:46 字數 1744 閱讀 7147

一、建立檔案

1、dfsclient.create()用於建立乙個空檔案,返回乙個輸出流物件。在函式內部,會構造乙個dfsoutputstream,它主要是通過namenode的rpc方法,建立乙個檔案到namenode。

2、此建構函式還會計算乙個包中最大可以放的資料。一般來說,資料報最大能達到64k,計算如下:

int chunksize = csize + checksumsize;//如512位元組實際資料計算出乙個校驗和4位元組資料,512 + 4

int n = 包頭

chunkperpacket = math.max((64k - n + chunksize - 1 )/chunksize, 1);//即((64k-包頭 - 1)/(512+4)) + 1,即乙個包內可存放多少個chunk資料,不足乙個的算乙個

packetsize = n + chunksize*chunkperpacket;//整個包的size

3、建構函式中還會開啟乙個datastream執行緒,它用於獲取新的資料塊,建立與資料節點的資料流管道,往資料界定傳送資料,接受應答等

二、資料流管道建立

1、在run函式中,迴圈從dataqueue佇列中取出packet包,通過呼叫nextblockoutputstream建立與下乙個資料塊的輸出流,並將該packet包加入ackqueue中,用於接受應答.所以,真正與資料節點建立的流blockstream在run()函式中建立,作為dfsoutputstream成員變數。

2、取出packet中的資料,寫往資料塊輸出流中。如果本次寫是該block的最後乙個packet包,則需要傳送乙個0,標示結束,blockstream.writeint(0)。通過flush強制將緩衝區資料刷到流中。

3、nextblockoutputstream:呼叫namenode rpc函式addblock,向namenode申請乙個塊locatedblock,包含多副本的多個datanodeinfo資訊。然後建立於第乙個dn的tcp連線。

三、寫資料

1、write(byte b,int off,int len)=>迴圈呼叫write1()將len長度的資料都寫進去=>writechecksumchunk()=>writechunk:如下

2、構造currentpacket物件,將本次呼叫的checksum及data寫入currentpacket物件。

3、上層迴圈呼叫write(),不斷將 512位元組資料及校驗和資料寫入currentpacket物件。始終保持校驗在前,實際資料在後。

4、當包被寫滿或者達到塊大小時,將currentpacket放入dataqueue佇列中,用於執行緒函式獲取並傳送。

5、responseprocessor處理寫應答

四、資料流管道出錯處理

1、如果資料流管道出錯,需要將資料流連線關閉,將資料報從ackqueue移動到dataqueue;

2、將出現故障的節點從列表中移除,並選擇乙個恢復的主資料節點,通過datanode的rpc方法recoverblock()發起塊恢復。如果恢復出錯又有重新選擇其他節點的機會,則重新選擇;否則出錯。如果恢復成功,則可以繼續寫資料。這時通過createblockoutputstream重新建立資料流管道,重複前面所述的步驟。客戶端通過此種機制,保證在寫的過程中出現錯誤,能夠剔除問題節點,並繼續寫檔案,降低錯誤資料節點的影響。

五、關閉輸出流

dfsoutputstream.close()方法:首先將快取中的資料刷入包中,並等待所有資料報的應答返回。然後傳送結束寫標誌「0」,向namenode關閉檔案。

至此,hdfs輸出流介紹完畢。

hdfs客戶端操作

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

hdfs客戶端操作

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

HDFS 客戶端入門 API

public class doitutils public class uploaddemo public class downdemo public class rename else 改名後的檔案 path path new path b.txt 將檔案移動到指定資料夾下 path path2 ...