设为首页 收藏本站
查看: 512|回复: 0

[经验分享] 第七章:小朱笔记hadoop之源码分析-hdfs分析 第四节:namenode-HeartbeatMonitor

[复制链接]

尚未签到

发表于 2016-12-13 09:08:23 | 显示全部楼层 |阅读模式
第七章:小朱笔记hadoop之源码分析-hdfs分析

第四节:namenode分析

4.5 namenode心跳检测分析HeartbeatMonitor

      DataNode节点在注册时候就开始定期向NameNode节点发送心跳包,以此来告知 NameNode节点自己当前还是可用的,同时从NameNode节点那里得到对自己的控制命令并执行。然而,当一个 DataNode节点没有按时向NameNode节点发送心跳包时,NameNode就会判定这个数据节点已经不可用了,并清除与之相关的数据信息(比如 在改数据节点上的数据块信息)。自然NameNode也再不会把该数据节点分配给客户端使用了。 FSNamesystem$HeartbeatMonitor后台工作线程,用于定期的检查已经接受到的心跳消息,确定哪些 DataNode 已经失效,然后将失效的 DataNode 从系统中移除。 Hadoop 中的心跳消息由 DataNode 发起,NameNode 中进行处理,最终由 HeartbeatMonitor 进行维护。
 

    // heartbeatRecheckInterval is how often namenode checks for expired datanodes  
private long heartbeatRecheckInterval;  
// heartbeatExpireInterval is how long namenode waits for datanode to report  
// heartbeat  
private long heartbeatExpireInterval;  
......
this.heartbeatRecheckInterval = conf.getInt("heartbeat.recheck.interval", 5 * 60 * 1000); // 5 minutes  
this.heartbeatExpireInterval = 2 * heartbeatRecheckInterval +10 * heartbeatInterval;  
 
heartbeatExpireInterval的值等于2个检查周期+10个心跳周期
HeartbeatMonitor 默认每隔5s运行一次,主要有两个工作:
(1)heartbeatCheck
 (a)检测datanode是否正常运行
 (b)默认每隔5分钟执行一次,可以通过heartbeat.recheck.interval进行配置   
 (c)遍历heartbeats中保存的datanode列表,判断datanode是否已经超时。超时时间根据heartbeatExpireInterval进行判断,若是超时,则将它从datanodeMap从清除。
(2)updateAccessKey
 (a)调用BlockTokenSecretManager.updateKeys,更新currentKey
 

    /**
* Periodically calls heartbeatCheck() and updateAccessKey()
*  
* 周期性地调用FSNamesystem类定义的heartbeatCheck方法,来监视Datanode结点发送的心跳状态信息,并做出处理
*/  
class HeartbeatMonitor implements Runnable {  
private long lastHeartbeatCheck;  
private long lastAccessKeyUpdate;  
/**
*/  
public void run() {  
while (fsRunning) {  
try {  
long now = now();  
if (lastHeartbeatCheck + heartbeatRecheckInterval < now) {  
heartbeatCheck();  
lastHeartbeatCheck = now;  
}  
if (isAccessTokenEnabled && (lastAccessKeyUpdate + accessKeyUpdateInterval < now)) {  
updateAccessKey();  
lastAccessKeyUpdate = now;  
}  
} catch (Exception e) {  
FSNamesystem.LOG.error(StringUtils.stringifyException(e));  
}  
try {  
Thread.sleep(5000);  // 5 seconds  
} catch (InterruptedException ie) {  
}  
}  
}  
}  
 判断dadanode死亡逻辑:NameNode节点是根据数据节点上一次发送的心跳包时间和现在的时间差是否超出heartbeatExpireInterval来判断它是否已dead。

    private boolean isDatanodeDead(DatanodeDescriptor node) {  
return (node.getLastUpdate() <  
(now() - heartbeatExpireInterval));  
}  
 
 
 
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-313557-1-1.html 上篇帖子: 异步机制(Asynchronous) -- (二)异步消息机制兼谈Hadoop RPC 下篇帖子: 第七章:小朱笔记hadoop之源码分析-hdfs分析 第四节:namenode-SafeModeMonitor
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表