一、 前言
今天朋友问我HDFS中,如果namenode 10分30秒没有收到dn心跳,则判断dn不可用,这个10分30秒是怎么来的。翻源码过程如下。版本:hadoop270
二、Datanode发送心跳
1、DataNode.java的main方法
2、createDataNode方法
3. instantiateDataNode方法
4. makeInstance方法
5. 实例化DataNode对象,在初始化一些配置之后,进入startDataNode方法,启动dn
6. 初始化块池管理器,向nn注册
7. 启动BPOfferService,每个bpos对应一个nn组(一主一备)
8. BPServiceActor(每个BPServiceActor对应一个nn)是一个线程,找到其run方法。循环向nn注册/心跳
9. offerService方法,拿到nn的代理,通过RPC请求向nn发送心跳
10. NameNodeRpcServer类的sendHeartbeat方法,一路追
刷新lastUpdateMonotonic这个值
三、NameNode处理心跳
1. NameNode的main方法
2、实例化
3、初始化
4. 启动一些(主备)共有服务
5、启动一些线程
6、监控心跳的线程
可以看到,每隔5min(heartbeatRecheckInterval)就进行一次心跳检查
7. 心跳检查时候判断dn是否dead,如果10min30S没有收到心跳,既判断为dead
node.getLastUpdateMonotonic是datanode调用NN RPC服务时更新的。上文已表述