DataNode查看他的属性,可以分成以下几个方面:
1.offerService()方法,此方法在DataNode主循环中执行,做的事情包括和NameNode心跳交互;通知NameNode一段时间以来收到的block;本机block的报告
2.DataXceiverServer,主要处理block的读写
3.BlockScanner,对本机block的扫描和校验处理
4.FSDataset,本机block存储的入口
5.ipcServer,主要是DataNode和DataNode之间recover block时使用。
这里主要说明第1点,其它几点在另外一文中已经介绍过,offerService的主要流程见下图:
offerService是在一个while循环里面被执行,只要DataNode存活,就一直被执行,工作流程如下:
1.如果距离上一次heartbeat时间超过了指定的时间,调用namenode.sendHeartbeat方法,namenode是ipc的框架下的一个proxy,可以认为就是远程的NameNode,该方法向NameNode汇报DataNode还存活,以及汇报DataNode的利用率,NameNode会返回一系列关于本DataNode的BlockCommand
2.DataNode处理返回的BlockCommand,BlockCommand有DNA_TRANSFER(发送block去指定的DataNode),DNA_INVALIDATE(删除指定的本机上面的block),DNA_SHUTDOWN(DataNode停止工作),DNA_REGISTER(DataNode向NameNode注册),DNA_FINALIZE(DataNode完成升级流程),DNA_RECOVERBLOCK(recover block)等
3.报告自从上一次心跳以来DataNode收到的block信息,调用namenode.blockReceived方法
4.如果距离上一次block report时间超过了指定的时间,调用namenode.blockReport方法,NameNode会返回一系列的DatanodeCommand,接下来的处理就和第2点一样了
5.根据其他条件,适当的做一些处理,主要是为了考虑资源利用等等