hadoop节点在磁盘坏掉的时候需要节点下线,按照下线步骤操而不是直接kill,是为了让数据安全的转移。比如hbase的regionserver直接kill掉的话,如果运气再坏一点这个regionserver上刚好是root表或meta表所在的机器,那可能导致hbase集群不可用。
1. hbase regionserver下线
直接执行hbase bin目录下的graceful_stop.sh <nodename>. 这个命令执行时,会先把banlance_switch关掉,然后转移该regionserver维护的region到其他节点,然后stop掉进程。后续hbase运维中,我们需要手动开启均衡器【hbase shell banlance_switch true】
2.hadoop datanode下线
首先配置好需要下线的节点和正常跑的节点,在hdfs-site.xml中配置如下:
- <property>
- <name>dfs.hosts</name>
- <value>/home/hadoop/cdh5/hadoop250/etc/hadoop/slaves</value>
- </property>
- <property>
- <name>dfs.hosts.exclude</name>
- <value>/home/hadoop/cdh5/hadoop250/etc/hadoop/exclude-slaves</value>
- </property>
dfs.hosts所对应的文件中列出了所有可以连接到namenode的datanode,如果为空则所有的都可以连入。dfs.hosts.exclude所对应的文件中列出了禁止连接namenode的datanode节点。如果一个节点在这两个文件中都存在,则不允许连入。
下线datanode步骤如下:
1 |
将要下线的机器加入到dfs.hosts.exclude指定的文件中(使用主机名,ip基本不靠谱),然后刷新配置hadoop dfsadmin -refreshNodes。 |
2 |
通过hadoop dfsadmin -report或者web界面,可以看到,该datanode状态转为Decommission In Progress。 |
3 |
当decommission进程完成数据移动,datanode状态会转变为Decommissioned,然后datanode会自动停止datnode进程。然后你可以看见dead nodes下多了一个你想要下线的节点。 |
4 |
然后删除include和exclude中该节点的hosts,重新刷新hadoop dfsadmin -refreshNodes |
5 |
最后别忘了删除slaves中该节点的配置,防止下次整个集群重启时,该节点不能通过namenode自动启动。可以同过hdfs的web页面查看下线的进度,也可以通过下线节点的datanode日志查看下线过程。 |
注意: |
当你下线一个datanode节点,有可能该节点长时间处于Decommission In Progress状态,一直不能转变为Decommissioned。请你用hadoop fsck /检查下是否有些块少于指定的块数,特别注意那些mapreduce的临时文件。将这些删除,并且从垃圾箱移除,该节点就可以顺利下线。这是我解决该问题的办法。 |
2.上线一个节点的步骤如下:
1 |
保证将要上线的机器不存在于dfs.hosts.exclude所对应的的文件中,并且存在于dfs.hosts所对应的文件中 |
2 |
在namenode上刷新配置:hadoop dfsadmin -refreshNodes |
3 |
在要上线的节点重启datanode,hadoop-daemon.sh start datanode |
4 |
通过hadoop dfsadmin -report或者web界面,可以看到,节点已经上线 |