时间:2021-05-20
本文主要分析了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的流程.
下图是报文的格式
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)
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
扫描到wsd是扫描通信协议那里,WSD是一种通信协议,通常用于扫描仪和打印机。是单向通信协议。通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。 通信
以网络通信协议为例,基本通信协议有NetBEUI协议、IPX/SPX及其兼容协议、TCP/IP协议。网络通信协议为连接不同操作系统和不同硬件体系结构的互联网络引
hdq是Headquarters协议。 HDQ通信协议是美国德州仪器的单线通信协议。智能电池的检测模块就是用这个协议。在电池的负极与线路板的地之间串接一个检测
局域网中常用的通信协议主要包括TCP/IP、NETBEUI和IPX/SPX三种协议,每种协议都有其适用的应用环境。 通信协议(communicationspr
通信协议是指通信各方事前约定的通信规则,可以简单地理解为各计算机之间进行相互会话所使用的共同语言。通信协议具有层次性、可靠性和有效性。局域网中常用的通信协议主要