为了保证分布式数据的一致性和完整性,hadoop写数据流时使用了写数据和应答的双向机制.
这里着重说明的是反向应答其实是分为两部分:
1.写请求答应:
正常情况下,这个应答会从管道的最后一个数据节点开始,往客户端方向发送,管道上的每一个节点都会等待这个应答,收到应答后,才会开始接受数据,也就是说,客户端会等待这个应答,然后才开始发送数据。这个应答是同步的,即直到收到应答后才会进行下一步。应答包的结构,只有两个字段:返回码和附加信息,当返回码是OP_STATUS_ERROR时,附件信息提供了流中第一个出错的数据节点地址信息.
2.写数据应答:
客户端通过数据流管道发送数据,管道上的数据节点会在接受数据并写磁盘后,需要给上游节点发送确认包,以清除缓冲区的内容。确认包从最后一个数据节点发送,逆流而上,直达数据源。应答包对应的类是:
DataTransferProtocol.PipelineAck.
下面贴下略简代码,以注释方式说明几个本人以为的需要关注的点:
1.写请求应答处理的代码:
/**
* 1.当前节点的写请求应答处理
*/
if (targets.length > 0) {
InetSocketAddress mirrorTarget = null;
mirrorNode = targets[0].getName();
mirrorTarget = NetUtils.createSocketAddr(mirrorNode);
mirrorSock = datanode.newSocket();
try {
int timeoutValue = datanode.socketTimeout +
(HdfsConstants.READ_TIMEOUT_EXTENSION * numTargets);
int writeTimeout = datanode.socketWriteTimeout +
(HdfsConstants.WRITE_TIMEOUT_EXTENSION * numTargets);
N