前言
本文隶属于专栏《大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和参考文献请见大数据技术体系
正文
Hadoop 集群的管理员经常需要向集群中添加节点,或从集群中移除节点。
例如,为了扩大存储容量,需要委任节点。
相反的,如果想要缩小集群规模,则需解除节点。
如果某些节点表现反常,例如故障率过高或性能过于低下,则需要解除该节点。
通常情况下,节点同时运行 DataNode 和 NodeManager,因而两者一般同时被委任或解除。
1.委任新节点
委任一个新节点非常简单。
- 首先,配置 hdfs-site.xml 文件,指向 NameNode;
- 其次,配置 yarn-site.xml 文件,指向 ResourceManager;
- 最后,启动 DataNode 和 ResourceManager 守护进程。
然而,预先指定一些经过审核的节点以从中挑选新节点仍不失为一种好的方法。
随便允许一台机器以 DataNode 身份连接到 NameNode 是不安全的,因为该机器很可能会访问未授权的数据。
此外,这种机器并非真正的 DataNode, 不在集群的控制之下,随时可能停止,导致潜在的数据丟失。
由于错误配置的可能性,即使这些机器都在本机构的防火墙之内,这种做法的风险也很高。
因此所有工作集群上的 DataNode( 以及NodeManager)都应该被明确管理。
允许连接到 NameNode 的所有 DataNode 放在一个文件中,文件名称由 dfs.hosts 属性指定。
该文件放在 NameNode 的本地文件系统中,每行对应一个 DataNode 的网络地址(由 DataNode 报告——可以通过 NameNode 的网页查看)。
如果需要为一个 DataNode 指定多个网络地址,可将多个网络地址放在一行,由空格隔开。
类似的,可能连接到 ResourceManager 的各个 NodeManager 也在同一个文件中指定(该文件的名称由 yarn.resourcemanager.nodes.inclade-path 属性指定。
在通常情况下,由于集群中的节点同时运行 DataNode 和 NodeManager 守护进程,dfs.hosts 和 yarn.resourcemanager.nodes.include-path 会同时指向一个文件,即include 文件。
向集群添加新节点的步骤如下
- 将新节点的网络地址添加到 include 文件中。
- 运行以下指令,将审核过的一系列 DataNode 集合更新至 NameNode 信息:
% hdfs dfsadmin -refreshNodes
- 运行以下指令,将审核过的一系列 NodeManager信息更新至 ResourceManager:
% yarn rmadmin -refreshNodes
- 以新节点更新 slaves 文件。这样的话,Hadoop控制脚本会将新节点包括在未来操作之中。
- 启动新的 DataNode 和 NodeManager。
- 检查新的 DataNode 和 NodeManager是否都出现在网页界面中。
HDFS 不会自动将块从旧的 DataNode 移到新的 DataNode 以平衡集群。用户需要自行运行均衡器。
可以参考我的这篇博客——《一篇文章搞懂HDFS的数据负载均衡策略》
2.解除旧节点
HDFS 能够容忍 DataNode 故障,但这并不意味着允许随意终止 DataNode。
以三复本策略为例,如果同时关闭不同机架上的三个 DataNode, 则数据丢失的概率会非常高。
正确的方法是,用户将拟退出的若干 DataNode 告知 NameNode, Hadoop 系统就可在这些DataNode 停机之前将块复制到其他DataNode。
有了 NodeManager的支持,Hadoop 对故障的容忍度更高。
如果关闭一个正在运行 MapReduce 任务的 NodeManager,application master 会检测到故障, 并在其他节点上重新调度任务。
解除节点的过程由 exclude 文件控制。
对于HDFS 来说,文件由dfs.
hosts.exclude 属性设置;
对于 YARN 来说,文件由 yarn.resourcemanager.
nodes.exclude-path 属性设置。
这些文件列出若干未被允许连接到集群的节点。
通常,这两个属性指向同一个文件。
判断一个 NodeManager能否连接到 ResourceManager非常简单。
仅当 NodeManager出现在 exclude 文件且不出现在 exclude 文件中时,才能够连接到 ResourceManager。
注意,如果未指定 include 文件,或 exclude 文件为空,则意味着所有节点都包含在 exclude 文件中。
HDFS 的规则稍有不同。
如果一个 DataNode 同时出现在 include 和 exclude 文件中,则该节点可以连接,但是很快会被解除委任。
与 NodeManager类似,如果未指定 include 文件或 include 文件为空,都意味着包含所有节点。
从集群中移除节点的步骤如下
- 将待解除节点的网络地址添加到 exclude 文件中,不更新 include 文件。
- 执行以下指令,使用一组新的审核过的 DataNode 来更新 NameNode 设置:
% hdfs dfsadmin -refreshNodes
- 使用一组新的审核过的 NodeManager来更新 ResourceManager设置:
% yarn rmadmin -refreshNodes
- 转到网页界面,查看待解除 dataNode 的管理状态是否已经变为“正在解除” (Decommission In Progress),因为此时相关的 DataNode 正在被解除过程之中。这些 DataNode 会把它们的块复制到其他 DataNode 中。
- 当所有 DataNode 的状态变为 “解除完毕” (Decommissioned)时,表明所有块都己经复制完毕。关闭已经解除的节点。
- 从 include 文件中移除这些节点,并运行以下命令:
% hdfs dfsadmin -refreshNodes
% yarn rmadmin -refreshNodes
- 从slaves 文件中移除节点。