设为首页 收藏本站
查看: 1216|回复: 0

[经验分享] hadoop client与datanode的通信原理

[复制链接]

尚未签到

发表于 2015-7-11 12:15:55 | 显示全部楼层 |阅读模式
  本文主要分析了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的流程.
DSC0000.png
  下图是报文的格式
DSC0001.png
  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)
  转载请注明出处! (http://www.iyunv.com/shenh062326/archive/2012/11/20/client_datanode.html)
  http://www.iyunv.com/shenh062326/archive/2012/11/20/client_datanode.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-85555-1-1.html 上篇帖子: Hadoop YARN资源隔离技术 下篇帖子: 细水长流Hadoop源码分析(3)RPC Server初始化启动过程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表