先说现象,在 yarn 的 web 页面,Lost Nodes 指标显示的数据异常,如下:
我的集群一共有 5 台节点,这里显示有一台节点为Lost Nodes
,但依然有 5 台Active Nodes
,细心观察发现或有某个节点即存在 Active Nodes 中也存在 Lost Nodes 中,只是端口不一样。
这种情况如何解决呢?
在yarn-site.xml
中添加yarn.nodemanager.address
配置项,如下:
<property>
<name>yarn.nodemanager.address</name>
<value>${yarn.nodemanager.hostname}:65033</value>
</property>
需要重启 RM ,让参数生效。
现在你可以去修改你集群的配置,是不是瞬间心情愉快了很多,那是不是可以继续读下去,看下我们如何解决这种问题。
首先利用搜索引擎,看下是否有没有前人帮你埋坑。(当你搜到这篇 blog,说明你已经具有了这种能力)
没有前人埋坑,怎么办?有的同学就慌了,解决不了了,怎么办?先重启解决吧。。。 重启是可以解决遇到的问题,但我们不能遇到问题就重启。在重启之前,我们也要进行一些评估,评估下这个问题是不是很严重,是不是需要立马解决。
目前我们遇到的这个问题很明显不是那种需要立马重启服务来解决的问题,那我们应该怎么解决这个问题呢?最好的答案就是看源码。
一个项目代码那么多,在你不熟悉每一行代码的时候如何快速定位关键代码并找到问题所在呢?
我认为很简单,就两步,首先全文检索找到表象,然后逆向跟踪代码并找到答案
。
全文检索关键字Lost Nodes
,结果如下:
从结果中我们可以根据经验定位到关键入口应该在 webapp 包中,点击进MetricsOverviewTable
中的相关代码位置
代码如下:
th().$class("ui-state-default")._("Lost Nodes")._()
// 这里只是一个页面样式,并没有涉及到赋值,看下上下文有没有取值的相关代码
// 发现代码如下
td().a(url("nodes/lost"),String.valueOf(clusterMetrics.getLostNodes()))._()
是不是找到了,clusterMetrics
是一个ClusterMetricsInfo
的对象。
ClusterMetricsInfo 存储了整个集群的 metrics 信息,其中有个属性lostNodes
,然后根据这个属性跟踪到ClusterMetrics.numLostNMs
,该属性存在三个方法,如下: