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请求创建文件, 然后启动dataStreamer线程

2. client包括三个线程, main线程负责把本地数据读入内存, 并封装为Package对象, 放到队列dataQueue中.

3. dataStreamer线程检测队列dataQueue是否有package, 如果有, 则先创建BlockOutPutStream对象(一个block创建一次, 一个block可能包括多个package), 创建的时候会和相应的datanode通信, 发送DATA_TRANSFER_HEADER信息并获取返回. 然后创建ResponseProcessor线程, 负责接收datanode的返回ack确认信息, 并进行错误处理.

4. dataStreamer从dataQueue中拿出Package对象, 发送给datanode. 然后继续循环判断dataQueue是否有数据…..

下图展示了write block的流程.

image

下图是报文的格式

image

Read block

主要在BlockReader类中实现.

初始化newBlockReader时,

1. 通过传入参数sock创建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. 创建输入流 new SocketInputStream(socket, timeout)

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

4. 根据输入流创建checksum : DataChecksum checksum = DataChecksum.newDataChecksum( in )

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

注: 512个字节为一个chunk计算checksum(4个字节)

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)

相关文章

  • 基于Retrofit+Rxjava实现带进度显示的下载文件

    基于Retrofit+Rxjava实现带进度显示的下载文件

    这篇文章主要为大家详细介绍了基于Retrofit+Rxjava实现带进度显示的下载文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • JAVA Frame 窗体背景图片,首位相接滚动代码实例

    JAVA Frame 窗体背景图片,首位相接滚动代码实例

    这篇文章主要介绍了JAVA Frame 窗体背景图片,首位相接滚动代码示例,需要的朋友可以参考下复制代码
    2017-04-04
  • springboot返回前端中文乱码的解决

    springboot返回前端中文乱码的解决

    这篇文章主要介绍了springboot返回前端中文乱码的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 解析java中volatile关键字

    解析java中volatile关键字

    这篇文章主要为大家解析了java中volatile关键字,经常有人把volatile关键字和synchronized或者lock混淆,本文就为大家好好区分,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • Java 读取外部资源的方法详解及实例代码

    Java 读取外部资源的方法详解及实例代码

    这篇文章主要介绍了Java 读取外部资源的方法详解及实例代码的相关资料,经常有读取外部资源的要求,如配置文件等等需要读取,需要的朋友可以参考下
    2017-03-03
  • 身份证号码验证算法深入研究和Java实现

    身份证号码验证算法深入研究和Java实现

    这篇文章主要介绍了身份证号码验证算法深入研究和Java实现,本文讲解了18身份证号码的结构、根据17位数字本体码获取最后一位校验码程序实例等内容,需要的朋友可以参考下
    2015-06-06
  • Hibernate实现悲观锁和乐观锁代码介绍

    Hibernate实现悲观锁和乐观锁代码介绍

    这篇文章主要介绍了Hibernate实现悲观锁和乐观锁的有关内容,涉及hibernate的隔离机制,以及实现悲观锁和乐观锁的代码实现,需要的朋友可以了解下。
    2017-09-09
  • Scala隐式转换和隐式参数详解

    Scala隐式转换和隐式参数详解

    Scala隐式转换和隐式参数是两个非常强大的功能,它们可以让我们编写更灵活和优雅的代码,但也需要注意一些潜在的问题和风险,这篇文章主要介绍了Scala隐式转换和隐式参数,需要的朋友可以参考下
    2023-04-04
  • Spring Boot中WebMvcConfig配置详解及示例代码

    Spring Boot中WebMvcConfig配置详解及示例代码

    WebMvcConfig是一个配置类,它继承了WebMvcConfigurationSupport,允许我们对SpringMVC进行更细粒度的控制,这篇文章主要给大家介绍了关于Spring Boot中WebMvcConfig配置详解及示例的相关资料,需要的朋友可以参考下
    2024-03-03
  • Java Lambda表达式与匿名内部类的联系和区别实例分析

    Java Lambda表达式与匿名内部类的联系和区别实例分析

    这篇文章主要介绍了Java Lambda表达式与匿名内部类的联系和区别,结合实例形式分析了Java Lambda表达式与匿名内部类功能、用法、区别及操作注意事项,需要的朋友可以参考下
    2019-10-10

最新评论