HDFS DataNode动态添加与删除

1. 动态添加DataNode

在不关闭HDFS和YARN的情况下,动态添加DataNode

1.1. 先准备一台服务器hadoop4

hostname hadoop1 hadoop2 hadoop3 hadoop4
ip 192.168.57.101 192.168.57.102 192.168.57.103 192.168.57.104
system ubuntu16.04 ubuntu16.04 ubuntu16.04 ubuntu16.04
HDFS NameNode DataNode DataNode SecondaryNameNode DataNode DataNode
YARN NodeManager ResourceManager NodeManager NodeManager NodeManager
  • hadoop4配置静态ip、hostname
  • 修改集群脚本:再多循环一个节点
  • 各节点hosts添加hadoop4的记录
  • NameNode和ResourceManager配置SSH免密码登录到hadoop4
  • 复制集群jdk、Hadoop到hadoop4
  • hadoop4删除hadoop同步得到的logs和data目录,一定要删除
  • hadoop4配置环境变量

查看web ui,现在只有3个DataNode

1.2. 动态添加DataNode

启动服务。因为core-site.xml中已经指明了NameNode的地址,所以启动DataNode后,会直接向NameNode注册

1
hadoop-daemon.sh start datanode

查看进程。如果发现datanode没有启动,很可能是该节点原本的logs和tmp目录忘了删除了

1
2
3
# jps
2644 Jps
2573 DataNode

查看WebUI,可以看到DataNode添加成功

再启动nodemanager。因为yarn-site.xml已经指定了ResourceManager,所以启动nodemanager时会向其注册

1
yarn-daemon.sh start nodemanager

ResourceManager查看nodemanager

1
yarn node -list

1.3. 集群的再平衡

动态添加了DataNode,可能其它DataNode数据很多,但是新的DataNode没有数据,导致不平衡。此时NameNode执行以下命令,实现数据块的再平衡

1
start-balancer.sh

1.4. 测试上传文件

在新节点上执行上传文件

1
hdfs dfs -put 2.txt /

可以看到数据有3个副本。因为当前client是在datanode节点上执行的,根据就近原则,一定有一个副本是放在当前节点上

1.5. 编辑slaves

在slaves中添加节点,以便下次HDFS重启能一起启动hadoop4。

1
2
3
4
hadoop1
hadoop2
hadoop3
hadoop4

2. 动态解除DataNode

2.1. 通过白名单解除DataNode

NameNode创建etc/hadoop/dfs.hosts,文件名无所谓,但是最好取官方默认的名称。写入以下内容,一行一个节点,只有白单名中的DataNode才有权连接NameNode,所以不添加hadoop4节点。注意不能有多余的空行,每行不能有多余的空格

1
2
3
hadoop1
hadoop2
hadoop3

在NameNode的hdfs-site.xml中增加dfs.hosts配置

1
2
3
4
5
<property>
<!-- 指定白名单文件的路径 -->
<name>dfs.hosts</name>
<value>/usr/local/hadoop/etc/hadoop/dfs.hosts</value>
</property>

分发hdfs-site.xml

1
xsync etc/hadoop/hdfs-site.xml

refreshNodes动态刷新dfs.hosts和dfs.hosts.exclude配置,无需重启NameNode

1
hdfs dfsadmin -refreshNodes

刷新后,查看WebUI,hadoop4被删除了

hadoop4查看进程

1
2
3
$ jps    # DataNode被关闭了,只剩下NodeManager
2721 NodeManager
2907 Jps

NameNode执行再平衡

1
start-balancer.sh

一般解除节点是通过黑名单,而不是白名单,所以不推荐使用白名单的方式来解除节点

2.2. 恢复刚才被白名单解除的DataNode

NameNode编辑dfs.hosts,添加hadoop4

1
2
3
4
hadoop1
hadoop2
hadoop3
hadoop4

NameNode刷新

1
hdfs dfsadmin -refreshNodes

hadoop4启动DataNode

1
hadoop-daemon.sh stop datanode

查看web ui,看到hadoop4恢复了

2.3. 通过黑名单解除DataNode

先去掉白单名

  • 编辑hdfs-site.xml,删除dfs.hosts配置。分发hdfs-site.xml
  • NameNode刷新hdfs dfsadmin -refreshNodes

NameNode创建etc/hadoop/dfs.hosts.exclude,文件名无所谓,但是最好取官方默认的名称。每一行代表黑名单中的节点。现在要将hadoop4加入黑名单

1
hadoop4

NameNode编辑hdfs-site.xml,添加dfs.hosts.exclude属性

1
2
3
4
5
<property>
<!-- 指定黑名单文件的路径 -->
<name>dfs.hosts.exclude</name>
<value>/usr/local/hadoop/etc/hadoop/dfs.hosts.exclude</value>
</property

分发

1
xsync etc/hadoop/hdfs-site.xml

NameNode刷新

1
hdfs dfsadmin -refreshNodes

查看web ui,看到状态是Decommission In Progress,表示正在解除hadoop4。此时HDFS会把hadoop4中的数据块复制到其它DataNode上,hadoop4中的数据越多,该过程就越漫长

过一段时间后,状态变为Decommissioned,即正式解除

可以看到hadoop4将块副本拷贝给hadoop1

NameNode执行再平衡

1
start-balancer.sh
panchaoxin wechat
关注我的公众号
支持一下