上篇分析了PendingReplicationMonitor 这次分析HeartbeatMonitor
看到这个类名,给我的第一印象就是server端定时心跳client端,其实在以前的话都是这么来做的,但是当client端太多的时候就不适合这种心跳检测模式了,改而换成client给server端发送心跳信息,server端只是负责接收心跳而已,他只是需要在一个端口listen心跳信息即可,如果在一定时间内没收到心跳信息就认为这个client挂了,这种实现方式在client多的情况下很有效,而且对server端的压力大大降低。
好了有了上面的铺垫,那么我们来看看HeartbeatMonitor具体做了什么
首先我们定位到具体执行心跳检测的方法上heartbeatCheck,然后看下他的java doc
/**
* Check if there are any expired heartbeats, and if so,
* whether any blocks have to be re-replicated.
* While removing dead datanodes, make sure that only one datanode is marked
* dead at a time within the synchronized section. Otherwise, a cascading
* effect causes more datanodes to be declared dead.
*/
void heartbeatCheck()
注释说的很明白我就不翻译了,我们来看看程序的具体实现逻辑,所有的心跳信息都存放在一个列表中,
/**
* Stores a set of DatanodeDescriptor objects.
* This is a subset of {@link #datanodeMap}, containing nodes that are
* considered alive.
* The {@link HeartbeatMonitor} periodically checks for outdated entries,
* and removes them from the list.
*/
ArrayList<DatanodeDescriptor> heartbeats
那么这些心跳数据从何而来呢,顺腾摸瓜最后到了DataNode,调用过程如下
DataNode.create()------->NameNode.register()------->FSNamesystem.registerDatanode
首先看下心跳的间隔时间和过期时间
long heartbeatInterval = conf.getLong("dfs.heartbeat.interval", 3) * 1000;
this.heartbeatRecheckInterval = conf.getInt(
"heartbeat.recheck.interval", 5 * 60 * 1000); // 5 minutes 心跳检测一次dataNode的心跳信息
this.heartbeatExpireInterval = 2 * heartbeatRecheckInterval +
10 * heartbeatInterval; //datanode的心跳过期时间 超过这个时间的就认为死了
检测分2步
1:// locate the first dead node.
比较 datanode发来的心跳信息更新时间 与 过期时间 确定是否已经是死datanode
2:如果是死节点则进一步执行一些与这个节点相关的操作
例如 : 1)删除心跳检测信息
2)更新统计信息
3)删除块映射信息
4)从无效集合中删除该节点信息(这个无效节点是干啥的?)
5)删除节点集群中该节点的信息(这个信息是干啥的?)
上面只是在datanode创建的时候发送的心跳信息,其实在正常运行过程中也是需要发送心跳信息的:
发送过程如下:
DataNode.create------->DataNode.start------->DataNode.offerService---->NameNode.sendHeartbeat---->FSNamesystem.handleHeartbeat
在handleHeartbeat中主要通过更新DatanodeDescriptor这个对象实现的,因为同一个DatanodeDescriptor既放在
heartbeats列表中又放在datanodeMap中,引用是一个。
然后这里有一点不好的是其实列表里的对象是没有重复的,那就应该使用set了,结果搞了个list,equal只比较了name和storageID
分享到:
相关推荐
NameNode职责
Hadoop Namenode性能诊断及优化
hdfs的namenode的元数据管理机制,简要画出了元数据管理的流程分析
NameNode及SecondaryNameNode分析
未知原因导致namenode 的fsimage等文件丢失,namenode重启失败的参考解决
NULL 博文链接:https://snv.iteye.com/blog/1884565
hadoop NameNode 源码解析
王家林的“云计算分布式大数据Hadoop实战高手之路---从零开始”的第九讲Hadoop图文训练课程:剖析NameNode和Secondary NameNode的工作机制和流程. 此教程来自于王家林免费发布的3本Hadoop教程:云计算分布式大数据...
大家都知道HDFS的架构由NameNode,SecondaryNameNode和DataNodes组成,其源码类图如下图所示:正如上图所示,NameNode和DataNode继承了很多的protocol用于彼此间的通信,其实nameNode还实现了...实现了ClientProtocol...
今天小编就为大家分享一篇关于Hadoop之NameNode Federation图文详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
Hadoop Namenode恢复
详细讲解了Hdfs中NameNode节点的配置,备份和恢复,以及secondNamenode的配置
HDFS体系结构主要由两部分组成:NameNode和DataNode。 NameNode NameNode是HDFS的中心节点,负责管理文件系统的命名空间。它维护着整个文件系统的目录结构、文件权限和数据块的映射关系。NameNode是HDFS的单点故障...
(1)第一次启动 NameNode 格式化后,创建 fsimage 和 edits 文件 (2)客户端对元数据进行增删改的请求 (3)NameNode 记录操作
■ NameNode 服务器线程数 ■ 用于来自客户端和DataNode 的RPC 调用的线程(心跳和元数据操作) ■ CM默认是30(非CM默认值为10) ■ 推荐:集群节点数x 20 的自然对数 ■ 设置太低的症状:DataNode 日志中的...
第5章 NameNode和SecondaryNameNode(面试开发重点) 5.1 NN和2NN工作机制 思考:NameNode中的元数据是存储在哪里的? 首先,我们做个假设,如果存储在NameNode节点的磁盘中,因为经常需要进行随机访问,还有响应...
最新的hdfs namenode主备安装文档,详细,命令只需要copy执行即可
1. Hadoop 2.0 2. 部署在2个Ubuntu上 3. 2个namenode 2个datanode
(1)第一次启动NameNode格式化后,创建Fsimage和Edits文件 (2)客户端对元数据进行增删改的请求 (3)NameNode记录操作日志,更新滚动