hadoop client与datanode的通信协议分析

2016-02-19 11:43 14 1 收藏

下面图老师小编要向大家介绍下hadoop client与datanode的通信协议分析,看起来复杂实则是简单的,掌握好技巧就OK,喜欢就赶紧收藏起来吧!

【 tulaoshi.com - 编程语言 】

本文主要分析了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

下图是报文的格式

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

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);

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

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.tulaoshi.com/n/20160219/1598375.html

延伸阅读
随着越来越多手提电话和个人数字助理开始融入到信息高速公路之上,从移动设备上访问Web站点变得越来越重要。只有你实现移动设备与非移动设备互相通信的功能后,你设计的移动设备应用程序才可以称的上是真正有用的。在本文中, 我们将通过一个简单的例子来学习如何实现手机与Servlet的网络通信。该程序经tomcat4.0.6、J2ME的MIDP简表及SUN的...
标签: flash教程
一个例子简单的描述了如何通过GET方法向服务器端的ASP发送请求: _root. pushAction = function(URL) { this.loadVariables(URL, "GET"); } var ask = true; var pushURL = "http://localhost/test/return.asp?ask="+ ask; pushAction (pushURL); _root.onEnterFrame = fuction(){          &nbs...
利用Visual C++在windows环境下设计异步串行通信程序可以使用不同的方法。一种方法可以使用windows系统提供的串行口API函数;另一种方法可以直接使用Microsoft公司提供的ActiveX控件MSCOMM.OCX。利用MSCOMM.OCX控件进行串行口程序设计相对比较简单,只要对该控件的属性、事件和方法进行设置和操作,就能完成简单的串行通信功能。而直接使用win...
一、 什么是VxD 从多任务操作系统Windows 3.1起,计算机中的任一物理设备x可同时被基于Dos或Windows的多个进程使用,这种一对多的关系称为"设备虚拟化",各进程通过运行在核心层的VxD(虚拟x设备驱动程序)存取物理设备x。操作系统提供给用户的软件服务也可以用VxD实现。计算机中的其他资源,如CPU、内存等也可同时被多个进程使用...
标签: 服务器
snmp协议在windows下的安装与配置   1,开始--控制面板--添加删除程序--添加删除组件--管理和监视工具--然后勾上简单网络管理协议--点击确定,下一步开始安装 系统就会自动开始安装,在安装过程需要有一些系统文件,如果没有系统盘的话请到这里下载http://www.pc6.com/softview/SoftView_77392.html,完成安装后点击开始-...

经验教程

853

收藏

11
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部