现状
NameNode 通过调用机架解析脚本解析一个 node,并缓存结果。在某些情况下(例如 NN 刚切主之后),NN 的机架解析操作会非常频繁,会持续性地同时拉起几十个机架解析进程,直接打满机器 CPU。此外,由于调用进程开销较大,此时很可能会导致 NN 处理速度突然下降,导致 callQueue 打满,特别是对于那些负载非常高的集群,这种情况更加常见。
优化策略
- NameNode 在启动时首先加载全量机架解析表并缓存(只需加入到已有的 cache map 中即可,不用自己维护新的 cache)。
- 对于那些在 NameNode 启动时没有缓存的 IP,继续按照标准的机架解析流程进行解析(解析完成后自动添加到缓存中)。
- 机架 cache 的定期更新机制.
NameNode 新增配置
-
指定获取全量机架解析表的脚本
在hdfs-site.xml
中,新增一个配置项(例如net.topology.get-all-items.script.file.name
),取值为获取全量机架解析表的脚本,默认为 null. 对此脚本的要求是:- 脚本需要 chmod 增加 x 权限,否则 NameNode 无法执行此脚本。
- 执行该脚本,其输出应为完整的机架解析表。
- 解析表内容需要按照下面的格式组织:
- 每行一个解析项
- 每个解析项的格式为: 节点IP Rack
脚本的具体实现方式非常灵活,可以按需编写,根据解析表大小,可以选择逐项 echo 、cat 本地文件、ssh 到某台指定机器上执行某个命令、list PG 数据库、list redis 数据库,等等。
-
NameNode 机架缓存定期更新间隔
同样在hdfs-site.xml
中,新增一个定期更新配置项(例如
net.topology.refresh.interval.seconds
,默认值为3600(即1小时))。 注意:机架缓存的更新方式是执行上面指定的全量加载脚本(因此如果没有指定该脚本,则不更新),而非针对每个 DN IP 单独进行机架解析并更新缓存,原因:频繁拉起机架解析进程会严重占用 NN 机器 CPU.
机架解析表加载脚本示例
简单起见,这里选择逐行 echo 解析表
- 在 hdfs-site.xml 中,指定获取机架解析表的脚本:
<property>
<name>net.topology.get-all-items.script.file.name</name>
<value>/tmp/getAllRacks.sh</value>
</property>
- 脚本具体实现如下:
echo "192.168.202.11 /rack1"
echo "192.168.202.12 /rack2"
echo "192.168.202.13 /rack3"
-
NN 的机架解析表加载日志
网友评论