DFSClient从Namenode取得需要读取的文件对应的LocatedBlocks信息以后,就会按照block的顺序与datanode建立链接并发送读取block数据的请求。我们看一下这部分的协议格式:
4字节 | 数据传输协议版本号(0.19.1版本的hadoop这个字段为14) |
4字节 | 操作码(读取文件时为:OP_READ_BLOCK,对应81) |
8字节 | Block的BLOCKID字段 |
8字节 | Block的时间戳字段 |
8字节 | 读取在block数据文件开始的偏移量 |
8字节 | 一共读取多少字节 |
Text | Client名称字串,格式为字串长度(这个采取了压缩形式)+字串内容 |
DFSClient发送读取数据块儿请求完成以后,首先等待datanode的应答,datanode应答协议格式如下:
4字节 | OP_STATUS_SUCCESS=0表示链接建立成功OP_STATUS_ERROR=1表示链接建立失败 |
接下来Datanode就开始进行数据传送,具体数据格式如下:
数据校验相关信息 | Byte | Chunksum类型 |
int | bytesPerChecksum每次checksum对应的字节数 | |
8字节 (这8字节有些情况是没有的) | Offset(读取一个block开始的偏移量) 1.DFSClient从Datanode读取block数据时,这个字段是必须有的。 2.Datanode之间进行block互相拷贝时(balance需要,或者block块儿没有达到副本个数要求),这个字段是不存在的。 | |
4字节 | packetLen,package长度 | |
8字节 | chunk的偏移量(用戶读取文件时,很可能偏移一个位置,偏移的位置很可能不在一个chunk的结束位置,因为checksum是按照chunk来计算的,所以hadoop会将这部分偏移量的数据多传送给client,client需要将这部分数据丢弃) | |
8字节 | Seqno序列号 | |
byte | 是否是block数据块的最后一个package | |
4字节 | 传输的block中包含的数据大小 | |
CheckSum数据 | 缺省的CheckSum为CRC32,(缺省每个chunk的checksum占四个字节) | |
实际block数据 | 有多少写多少 |