中国人寿企业文化理念:Hadoop_DataNode_代码分析(4)

来源:百度文库 编辑:中财网 时间:2024/05/03 07:28:19

(1)写操作:BlockReceiver作为处理writeBlock时候的主要类。写是通过管道实现的,写block可能是用户请求也可能是NameNode要求的block拷贝命令,不同情况处理不同。管道上的中间节点有四个方向的网络数据流,还有两个写block数据文件和校验文件的流。主线程负责读数据报直接转发给下一个DataNode,而单独启动新线程PacketResponder用来处理给上级的回复消息和接受下级的发送过来的消息。PacketResponder应用心跳机制,到一定时间会给上级发送心跳,这样只要最后一个DataNode按时发送心跳即可,其他的中间DataNode只要收到心跳并且转发就可以了,最大的上级就可以知道整个链路的情况。由此可知最后一个DataNode节点的PacketResponder应该向上级发送两种信息:心跳和完成写入的包,而中间节点收到下级节点发送的包序号时要和自己写入完成的包序号做比较从而保证整个链路写入的正确性。

(2)替换block操作:如果一个DataNode接受到了替换Block请求,那么这个请求中包含了要替换block所在的源DataNode,当前节点要向源节点发送拷贝Block的请求,拷贝请求和读Block类似。

(3)DataNode上面的block数据发生了任何改变,无论添加还是删除,都要通过notifyNamenodeReceivedBlock来告知NameNode。

(4)DataNode利用保存在receivedBlockList和delHints两个列表中的信息完成Block状态变化报告。receivedBlockList表明在这个DataNode成功创建的新的数据块,而delHints,是可以删除该数据块的节点。这两个列表的元素是一一对应的,如果delHints为空,就说明不需要删除。

(5)心跳和Block状态报告可以返回命令,这也是NameNode先DataNode发起请求的唯一方法。心跳以heartBeatInterval间隔发送。Block状态报告以blockReportInterval间隔发送。返回的命令主要有

  DNA_TRANSFER:拷贝数据块到其他DataNode

 

  DNA_INVALIDATE:删除数据块(简单方法)

  DNA_SHUTDOWN:关闭DataNode(简单方法)

  DNA_REGISTER:DataNode重新注册(简单方法)

  DNA_FINALIZE:提交升级(简单方法)

  DNA_RECOVERBLOCK:恢复数据块

命令执行的模式就是利用socket连接对应地址的serversocket,发送请求使得DataNode准备做什么,这些个什么就是:

OP_WRITE_BLOCK (80):写数据块

OP_READ_BLOCK (81):读数据块

OP_READ_METADATA (82):读数据块元文件

OP_REPLACE_BLOCK (83):替换一个数据块

OP_COPY_BLOCK (84):拷贝一个数据块

OP_BLOCK_CHECKSUM (85):读数据块检验码

(6)transferBlocks方法将为每一个Block启动一个DataTransfer线程,用于传输数据,每个进程相当于一个Client去请求目的DataNode。