欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

hadoop client與datanode的通信協議分析

 更新時間:2012年11月21日 15:50:47   作者:  
本文主要分析了hadoop客戶端read和write block的流程. 以及client和datanode通信的協議, 數據流格式等

本文主要分析了hadoop客戶端read和write block的流程. 以及client和datanode通信的協議, 數據流格式等.

hadoop客戶端與namenode通信通過RPC協議, 但是client 與datanode通信并沒有使用RPC, 而是直接使用socket, 其中讀寫時的協議也不同, 本文分析了hadoop 0.20.2版本的(0.19版本也是一樣的)client與datanode通信的原理與通信協議.  另外需要強調的是0.23及以后的版本中client與datanode的通信協議有所變化, 使用了protobuf作為序列化方式.

Write block

1. 客戶端首先通過namenode.create, 向namenode請求創(chuàng)建文件, 然后啟動dataStreamer線程

2. client包括三個線程, main線程負責把本地數據讀入內存, 并封裝為Package對象, 放到隊列dataQueue中.

3. dataStreamer線程檢測隊列dataQueue是否有package, 如果有, 則先創(chuàng)建BlockOutPutStream對象(一個block創(chuàng)建一次, 一個block可能包括多個package), 創(chuàng)建的時候會和相應的datanode通信, 發(fā)送DATA_TRANSFER_HEADER信息并獲取返回. 然后創(chuàng)建ResponseProcessor線程, 負責接收datanode的返回ack確認信息, 并進行錯誤處理.

4. dataStreamer從dataQueue中拿出Package對象, 發(fā)送給datanode. 然后繼續(xù)循環(huán)判斷dataQueue是否有數據…..

下圖展示了write block的流程.

image

下圖是報文的格式

image

Read block

主要在BlockReader類中實現.

初始化newBlockReader時,

1. 通過傳入參數sock創(chuàng)建new SocketOutputStream(socket, timeout), 然后寫通信信息, 與寫block的header不大一樣.

//write the header.

out.writeShort( DataTransferProtocol.DATA_TRANSFER_VERSION );

out.write( DataTransferProtocol.OP_READ_BLOCK );

out.writeLong( blockId );

out.writeLong( genStamp );

out.writeLong( startOffset );

out.writeLong( len );

Text.writeString(out, clientName);

out.flush();

2. 創(chuàng)建輸入流 new SocketInputStream(socket, timeout)

3. 判斷返回消息 in.readShort() != DataTransferProtocol.OP_STATUS_SUCCESS

4. 根據輸入流創(chuàng)建checksum : DataChecksum checksum = DataChecksum.newDataChecksum( in )

5. 讀取第一個Chunk的位置: long firstChunkOffset = in.readLong()

注: 512個字節(jié)為一個chunk計算checksum(4個字節(jié))

6. 接下來在BlockReader的read方法中讀取具體數據: result = readBuffer(buf, off, realLen)

7. 一個一個chunk的讀取

int packetLen = in.readInt();

long offsetInBlock = in.readLong();

long seqno = in.readLong();

boolean lastPacketInBlock = in.readBoolean();

int dataLen = in.readInt();

IOUtils.readFully(in, checksumBytes.array(), 0,

checksumBytes.limit());

IOUtils.readFully(in, buf, offset, chunkLen);

8. 讀取數據后checksum驗證; FSInputChecker.verifySum(chunkPos)

相關文章

  • MyBatis通過JDBC數據驅動生成的執(zhí)行語句問題

    MyBatis通過JDBC數據驅動生成的執(zhí)行語句問題

    這篇文章主要介紹了MyBatis通過JDBC數據驅動生成的執(zhí)行語句問題的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • Spring?Data?Jpa返回自定義對象的3種方法實例

    Spring?Data?Jpa返回自定義對象的3種方法實例

    在使用Spring Data Jpa框架時,根據業(yè)務需求我們通常需要進行復雜的數據庫查詢,下面這篇文章主要給大家介紹了關于Spring?Data?Jpa返回自定義對象的3種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Java聊天室之實現聊天室客戶端功能

    Java聊天室之實現聊天室客戶端功能

    這篇文章主要為大家詳細介紹了Java簡易聊天室之實現聊天室客戶端功能,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以了解一下
    2022-11-11
  • java組件commons-fileupload文件上傳示例

    java組件commons-fileupload文件上傳示例

    這篇文章主要為大家詳細介紹了java組件commons-fileupload實現文件上傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • SpringBoot啟動后立即執(zhí)行的幾種方法小結

    SpringBoot啟動后立即執(zhí)行的幾種方法小結

    在項目開發(fā)中某些場景必須要用到啟動項目后立即執(zhí)行方式的功能,本文主要介紹了SpringBoot啟動后立即執(zhí)行的幾種方法小結,具有一定的參考價值,感興趣的可以了解一下
    2023-05-05
  • Java中Dijkstra算法求解最短路徑的實現

    Java中Dijkstra算法求解最短路徑的實現

    Dijkstra算法是一種解決最短路徑問題的常用算法,本文主要介紹了Java中Dijkstra算法求解最短路徑的實現,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Java實例精煉掌握語法

    Java實例精煉掌握語法

    本章節(jié)我們將為大家介紹?Java?實現幾大基礎問題,通過實例學習我們可以更快的掌握?Java?的應用,感興趣的朋友來看看吧
    2022-04-04
  • Service層異常拋到Controller層處理還是直接處理問題分析

    Service層異常拋到Controller層處理還是直接處理問題分析

    這篇文章主要為大家介紹了Service層異常拋到Controller層處理還是直接處理的問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • mybatis-plus中的Enum用法實例

    mybatis-plus中的Enum用法實例

    本文主要介紹了mybatis-plus中的Enum用法實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • Java實現猜數字小游戲

    Java實現猜數字小游戲

    大家好,本篇文章主要講的是Java實現猜數字小游戲,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01

最新評論