HDFS讀寫資料過程

2021-06-19 02:54:10 字數 2077 閱讀 9174

一、檔案的開啟

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...