文章目录
(一)前提环境
(二)问题
(三)解决
(四)动态上线/下线Datanodes
4.1 下线一个datanode
4.2 上线一个datanode
(五)上线Yarn的nodemanager
(一)前提环境
我们都知道🔗Hadoop由3部分组成(除开公共部分):

HDFS™: 分布式文件系统,可提供应用程序数据的高吞吐量访问.
YARN: 作业调度和群集资源管理的框架.
MapReduce: 基于YARN的大型数据集的并行处理系统.
其中MapReduce部分,可以用更加高效的🔗Spark来进行计算。
同时如果只有Spark应用,则YARN也可以不启用,而是采用Spark独立集群来调度任务。
当然如果考虑到多种类型的应用,还是需要Yarn集群的。

(二)问题
测试的时候,我们配置了Hadoop的Workers(或Slaves)。
为了把Yarn用起来,将几台几乎没有存储空间的机器加入了集群,本想仅用于运算。

$ac@vm00 ~> cat $HADOOP_CONF_DIR/workers
vm00
vm01
vm02
vm10
vm11
ac1    #存储空间很小
ac2    #存储空间很小
ad1    #存储空间很小
ad2    #存储空间很小

但只在这里配置,会导致HDFS存储部分也会用到这几台机器。
所以不能仅配置workers。

(三)解决
这时候需要配置哪些主机可用于HDFS。

$ac@vm00 ~> vim $HADOOP_CONF_DIR/hdfs-site.xml
添加dfs.hosts和dfs.hosts.exclude属性。
指定运行HDFS的主机列表文件名,和不用于HDFS的主机列表文件名。

......
    <property>
        <!--运行的主机,配置文件名-->
        <name>dfs.hosts</name>
        <value>/home/ac/hadoop_conf/dfs_include</value>
    </property>
    <property>
        <!--动态下线的主机,配置文件名-->
        <name>dfs.hosts.exclude</name>
        <value>/home/ac/hadoop_conf/dfs_exclude</value>
    </property>
......
然后在dfs.hosts.exclude文件中指定不用与HDFS的主机。

$ac@vm00 ~> cat /home/ac/hadoop_conf/dfs_exclude
ac1
ac2
ad1
ad2

官方写的是:
dfs.hosts / dfs.hosts.exclude 
List of permitted/excluded DataNodes. 
If necessary, use these files to control the list of allowable datanodes.

经过配置后,HDFS中就没有这几台机器了。
如图:

Hadoop集群中某主机(Worker)不作为HDFS的存储(Datanode)_datanode

 

与此同时,Yarn集群中这几台机器资源是可用的。
如图:

Hadoop集群中某主机(Worker)不作为HDFS的存储(Datanode)_大数据_02


(四)动态上线/下线Datanodes

从注释中我们都看到了,这两个配置不仅指定能是否用于HDFS,还可以动态上线/下线存储节点。 

4.1 下线一个datanode
编辑dfs.hosts.exclude指定的文件/home/ac/hadoop_conf/dfs_exclude,加入一行主机vm02的名字。
刷新节点:

$ac@vm00 ~> hdfs dfsadmin -refreshNodes
Refresh nodes successful

这样在不用关闭集群存储,就移除了一台datanode。
如图只剩4台了:

Hadoop集群中某主机(Worker)不作为HDFS的存储(Datanode)_datanode_03

 

这时候我们可以对主机进行维护操作,
弄完重启什么的。
PS:咦,似乎忘记去vm02停止它的datanode了,参考下面启动的指令停止吧。

4.2 上线一个datanode
对主机的维护完成后。
编辑dfs.hosts.exclude指定的文件/home/ac/hadoop_conf/dfs_exclude,去掉主机vm02的名字。
再编辑dfs.hosts指定的文件/home/ac/hadoop_conf/dfs_include,加上一行主机vm02的名字。
刷新节点发现它又回来了,但是没有在线:

Hadoop集群中某主机(Worker)不作为HDFS的存储(Datanode)_yarn_04

用ssh或者随便怎么登录到vm02主机。
注意是在vm02主机上,
执行执行启动本机的datanode:

$ac@vm02 ~> hdfs --daemon start datanode
$ac@vm02 ~>
注意不要再用hadoop-daemon.sh start datanode脚本,目前可用,但以后不再支持了:

$ac@vm02 sbin> hadoop-daemon.sh start datanode
WARNING: Use of this script to start HDFS daemons is deprecated.
WARNING: Attempting to execute replacement "hdfs --daemon start" instead.
再看就发现它回来了:)

Hadoop集群中某主机(Worker)不作为HDFS的存储(Datanode)_hadoop_05


(五)上线Yarn的nodemanager

如果vm02还是Yarn集群的一部分,那么经过维护操作,还是需要重新加入到集群的。 

用ssh或者随便怎么登录到vm02主机。
注意是在vm02主机上,
执行执行启动本机的nodemanager:

$ac@vm02 ~> yarn --daemon start nodemanager
$ac@vm02 ~>
注意不要再用yarn-daemon.sh start nodemanager脚本,目前可用,但以后不再支持了:

$ac@vm02 ~> yarn-daemon.sh start nodemanager
WARNING: Use of this script to start YARN daemons is deprecated.
WARNING: Attempting to execute replacement "yarn --daemon start" instead.

呃……
没有改works,似乎不需要在master上执行???:

$ac@vm00 ~> yarn rmadmin -refreshNodes
2022-01-14 11:40:18,067 INFO client.DefaultNoHARMFailoverProxyProvider: Connecting to ResourceManager at vm00/192.168.168.121:8033

Yarn这边和HDFS差不多,不重复截图了吧。