1. 背景
在离线集群中,有些冷数据集群专用于存放HDFS数据,很少用来提供计算操作,这些机器的计算资源都浪费了,它们的典型特征是:只启动datanode服务,不启动nodemanager服务。为了提高这些机器的资源利用率,希望在其他计算集群需要资源的时候,resourcemanager可以在冷数据集群中启动NodeManager服务,最大化利用计算资源。
2. 整体设计
如下所示,通过NodeMananger资源管理平台,执行集群的扩容命令,空闲节点会根据集群匹配对应的集群NodeMananger配置,启动NodeMananger产生对于集群的心跳:
3. 功能与流程设计
NodeMananger管理平台提供两个功能:扩容和缩容操作。
- 扩容操作:
- 运维人员指定动态节点IP,需要资源的集群名,节点的核数、内存信息,发送给NodeMananger管理平台。
- NodeMananger从mysql数据库中获取动态节点信息,并插入即将扩容的节点。可以部署离线作业每天查询mysql观察动态资源池使用情况,输出报表信息。
- 管理平台创建一个包含扩容节点ip的nodemananger.onlist文件,发送给resourcemananger,随后让resourcemananger执行refreshNodes命令。
- 管理平台通过SSH远程操作扩容节点,根据集群名选择nodemananger启动的hadoop配置,随后启动nodemananger服务。
- 缩容操作:
- 运维人员指定动态节点IP,需要资源的集群名,发送给NodeMananger管理平台。
- 管理平台创建一个不包含扩容节点ip的nodemananger.onlist文件,发送给resourcemananger,随后让resourcemananger执行refreshNodes命令。随后NodeMananger根据心跳响应会自动终止进行,无需执行关闭nodemananger命令。
它们的流程如下:
4. NodeManager白名单限制
默认情况下,nodemanager只支持一个白名单和黑名单,例如:
<property>
<name>yarn.resourcemanager.nodes.include-path</name>
<value>nodemanager.onlist</value>
</property>
<property>
<name>yarn.resourcemanager.nodes.exclude-path</name>
<value>nodemanager.offlist</value>
</property>
但是在弹性资源池项目中,每个resourcemananger有两类nodemananger资源,一种是属于自身的固定nodemananger节点;第二种是从动态资源池中临时借过来的nodemananger节点。
每次扩缩容都会修改nodemanager.onlist和nodemanager.offlist文件。如果流程异常,将nodemananger.onlist中固定节点信息污染,可能导致固定节点下线,对集群造成致命影响。
为了提高安全性,需要将固定节点和动态节点分离成为两个nodemanager.onlist文件。Yarn代码需要支持读取nodemanager.onlist列表。如下所示:
<property>
<name>yarn.resourcemanager.nodes.include-path</name>
<value>nodemanager.onlist,nodemanager2.onlist</value>
</property>
<property>
<name>yarn.resourcemanager.nodes.exclude-path</name>
<value>nodemanager.offlist,nodemanager2.offlist</value>
</property>
5. 代码修改
如下所示,在HostsFileReader文件中,通过for循环读取文件列表: