个人笔记
SongPinru 的小仓库
HDFS 临时维护操作方法
背景
HDFS会自动维持副本数量,默认检查间隔是每3s一次,当发现集群中有块的副本数不足时,会触发副本自动复制,来保证数据的安全性。
但是当我们需要临时停机某个DataNode进行维护时(比如需要重启节点时),这个副本自动复制的机制就有点太过于灵活且耗费资源了,这个机制会消耗大量的网络和磁盘io来进行副本复制,此时我们知道我们的数据是没有丢失的(或者并没有全部丢失,不需要全量复制),我们希望能够暂时不要进行副本复制,尽量不要影响线上业务运行,此时我们可以利用HDFS的退役机制来完成这个功能。
实现原理
HDFS使用黑名单退役时(只加入黑名单即可),DateNode节点的状态变化:
NORMAL
DECOMMISSION_INPROGRESS
DECOMMISSIONED
ENTERING_MAINTENANCE
IN_MAINTENANCE
加入黑名单后,该节点的状态会变为IN_MAINTENANCE
,即维护状态,此时该节点上的数据也会处于维护状态,不会触发副本的自动复制机制,DataNode也不会把维护状态的Block返回给应用程序
当节点维护完成,只需把节点从黑名单中排除,然后refreshNodes,让其成为正常节点,即可退出维护模式
操作方法
进入维护模式
方法一:手动
登录到NameNode节点,找到NameNode的配置文件夹
root@bjuc51:/home/ops# cd /var/run/cloudera-scm-agent/process/
root@bjuc51:/var/run/cloudera-scm-agent/process# ll|grep NAMENODE
drwxr-x--x 3 hdfs hdfs 540 Sep 26 10:44 5438-hdfs-NAMENODE/
drwxr-x--x 3 hdfs hdfs 560 Sep 27 10:46 5442-hdfs-NAMENODE-nnRpcWait/
drwxr-x--x 3 hdfs hdfs 560 Oct 23 15:41 5646-hdfs-NAMENODE-refresh/
drwxr-x--x 3 hdfs hdfs 560 Oct 28 11:52 5701-hdfs-NAMENODE-refresh/
前缀id最大的文件夹即当前运行的NameNode配置文件夹
cd 5701-hdfs-NAMENODE-refresh/
vim hdfs-site.xml
首先查看有没有配置以下两项:
以下两个配置可以启用新的节点管理方式(可以使用json设置节点状态)
<property>
<name>dfs.hosts</name>
<value>/var/run/cloudera-scm-agent/process/5701-hdfs-NAMENODE-refresh/dfs_all_hosts.txt</value>
</property>
<property>
<name>dfs.namenode.hosts.provider.classname</name>
<value>org.apache.hadoop.hdfs.server.blockmanagement.CombinedHostFileManager</value>
</property>
编辑dfs_all_hosts.txt
文件,把需要维护的节点的adminState
添加改为IN_MAINTENANCE
vim dfs_all_hosts.txt
{"hostName":"10.11.20.49","port":9866,"adminState":"NORMAL"}
{"hostName":"10.11.20.50","port":9866,"adminState":"NORMAL"}
{"hostName":"10.11.20.53","port":9866,"adminState":"NORMAL"}
{"hostName":"10.11.20.54","port":9866,"adminState":"NORMAL"}
{"hostName":"10.11.20.55","port":9866,"adminState":"NORMAL"}
{"hostName":"10.11.20.101","port":9866,"adminState":"NORMAL"}
{"hostName":"10.11.20.102","port":9866,"adminState":"NORMAL"}
{"hostName":"10.11.20.114","port":9866,"adminState":"NORMAL"}
{"hostName":"10.11.20.115","port":9866,"adminState":"NORMAL"}
{"hostName":"10.11.20.116","port":9866,"adminState":"NORMAL"}
{"hostName":"10.11.20.69","port":9866,"adminState":"NORMAL"}
{"hostName":"10.11.20.70","port":9866,"adminState":"NORMAL"}
{"hostName":"10.11.20.71","port":9866,"adminState":"NORMAL"}
{"hostName":"10.11.20.72","port":9866,"adminState":"NORMAL"}
--{"hostName":"10.11.20.73","port":9866,"adminState":"NORMAL"}
++{"hostName":"10.11.20.73","port":9866,"adminState":"IN_MAINTENANCE"}
在当前目录下执行
hdfs --config /var/run/cloudera-scm-agent/process/5701-hdfs-NAMENODE-refresh dfsadmin -refreshNodes
注意此处config的参数为找到的NameNode配置文件夹
之后等待节点进入ENTERING_MAINTENANCE
状态,可以使用以下命令查看:
hdfs dfsadmin -report -enteringmaintenance
hdfs dfsadmin -report -inmaintenance
进入维护状态的节点可以下线停机进行维护,此时不会触发副本的自动复制
当维护结束时,确认节点已连接回NameNode后,只需推出维护模式即可
方法二:CDH刷新NameNode
借助CDH管理界面,进入
HDFS->配置->NameNode->dfs_all_hosts.txt
增加{"hostName":"10.11.20.73","port":9866,"adminState":"IN_MAINTENANCE"}
然后执行:
HDFS->实例->NameNode(活动)->操作->刷新节点列表
等待刷新完成即可
退出维护模式
方法一:手动
和进入维护模式一样,找到NameNode配置文件夹
修改dfs_all_hosts.txt
文件内容,改回退出维护模式的节点为NORMAL
然后执行:
hdfs --config /var/run/cloudera-scm-agent/process/5701-hdfs-NAMENODE-refresh dfsadmin -refreshNodes
注意此处config的参数为找到的NameNode配置文件夹
方法二:CDH刷新NameNode
借助CDH管理界面,进入
HDFS->实例->NameNode(活动)->操作->刷新节点列表
等待刷新完成即可