一、檔案的開啟
1.1、客戶端
hdfs開啟乙個檔案,需要在客戶端呼叫distributedfilesystem.open(path f, int buffersize),其實現為:
public fsdatainputstream open(path f, int buffersize) throws ioexception while (curpos < endoff
&& curblk < blocks.length
&& results.size() < nrblockstoreturn);
//使用此
locatedblock
鍊錶構造乙個
locatedblocks
物件返回
return inode.createlocatedblocks(results);
getblocklocationsinternal的實現如下:
1.3、客戶端
通過rpc呼叫,在namenode得到的locatedblocks物件,作為成員變數構造dfsinputstream物件,最後包裝為fsdatainputstream返回給使用者。
二、檔案的讀取
2.1、客戶端
檔案讀取的時候,客戶端利用檔案開啟的時候得到的fsdatainputstream.read(long position, byte buffer, int offset, int length)函式進行檔案讀操作。
public int read(long position, byte buffer, int offset, int length)
throws ioexception finally catch (ioexception ie) catch (throwable t) finally finally catch(remoteexception re) catch (interruptedexception e) catch (throwable e) while (retry && --count >= 0);
return nodes;
locatefollowingblock中通過rpc呼叫namenode.addblock(src, clientname)函式
3.4、namenode
namenode的addblock函式實現如下:
public locatedblock addblock(string src,
string clientname) throws ioexception finally
if (mirrorout != null) catch (ioexception e) catch (ioexception e) {
handlemirrorouterror(e);
buf.position(endofheader);
int len = buf.getint();
offsetinblock += len;
int checksumlen = ((len + bytesperchecksum - 1)/bytesperchecksum)*
checksumsize;
int checksumoff = buf.position();
int dataoff = checksumoff + checksumlen;
byte pktbuf = buf.array();
buf.position(buf.limit()); // move to the end of the data.
//將資料寫入本地的
block
out.write(pktbuf, dataoff, len);
/// flush entire packet before sending ack
flush();
// put in queue for pending acks
if (responder != null) {
((packetresponder)responder.getrunnable()).enqueue(seqno,
lastpacketinblock);
return payloadlen;
HDFS讀寫資料的過程
block 檔案上傳前需要分塊,這個塊就是block,一般為128mb,可以修改。因為塊太小 定址時間佔比過高。塊太大 map任務數太少,作業執行速度變慢。它是最大的乙個單位。packet packet是第二大的單位,它是client端向datanode,或datanode的pipline之間傳資料...
HDFS讀寫過程
讀過程 1 初始化filesystem,然後客戶端 client 用filesystem的open 函式開啟檔案 2 filesystem用rpc呼叫元資料節點,得到檔案的資料塊資訊,對於每乙個資料塊,元資料節點返回儲存資料塊的資料節點的位址。3 filesystem返回fsdatainputstr...
HDFS讀寫資料
一 檔案的開啟 1.1 客戶端 hdfs開啟乙個檔案,需要在客戶端呼叫distributedfilesystem.open path f,int buffersize 其實現為 public fsdatainputstream open path f,int buffersize throws io...