环境说明:
主机名       IP地址            用途
master      192.168.5.54      namenode、jobtracker
slave1      192.168.5.56      datanode、tasktracker
slave2      192.168.5.57      datanode、tasktracker
slave3      192.168.5.58      datanode、secondarynamenode、tasktracker


平常我们管理的Hadoop集群中的datanode节点意外宕机属于正常现象,但是当我们在平常的巡检中发现机器硬件故障需要停机维修的话,则需要按照规范的流程去把集群中的节点踢除,当然你也可以完全把进程都kill掉,我这里只介绍如何规范的将需要停机的datanode节点踢除集群。

加入slave1机器出现了硬件问题,我需要停机维护的话,则要先踢除集群。操作方法如下:

1、在namenode节点的hadoop部署目录下的conf目录下新建一个excludes文件。(我这里目录就是/root/hadoop/conf),内容如下:
touch /root/hadoop/conf/excludes
我这里只踢除一个节点,所以就写了一个IP地址,如要踢除多个则每行写一个哈。注意只能写IP地址。

[root@master conf]# cat excludes 
 192.168.5.56


2、在/root/hadoop/conf/core-site.xml文件下新增如下内容保存退出:
 

<property>
          <name>dfs.hosts.exclude</name>
          <value>/root/hadoop/conf/excludes</value>
          <final>true</final>
     </property>


3、然后在namenode节点执行如下命令,也就是让namenode重新读取配置文件。不需要重启集群。

[root@master ~]# hadoop/bin/hadoop dfsadmin -refreshNodes


4、查看集群状态:

[root@master ~]# hadoop/bin/hadoop dfsadmin -report
 Configured Capacity: 128672038912 (119.84 GB)
 Present Capacity: 73672425472 (68.61 GB)
 DFS Remaining: 73434574848 (68.39 GB)
 DFS Used: 237850624 (226.83 MB)
 DFS Used%: 0.32%
 Under replicated blocks: 0
 Blocks with corrupt replicas: 0
 Missing blocks: 0
 -------------------------------------------------
 Datanodes available: 3 (3 total, 0 dead)
 Name: 192.168.5.57:50010
 Decommission Status : Normal
 Configured Capacity: 67481608192 (62.85 GB)
 DFS Used: 118906880 (113.4 MB)
 Non DFS Used: 26367545344 (24.56 GB)
 DFS Remaining: 40995155968(38.18 GB)
 DFS Used%: 0.18%
 DFS Remaining%: 60.75%
 Last contact: Fri Jun 29 16:58:06 CST 2012Name: 192.168.5.58:50010
 Decommission Status : Normal
 Configured Capacity: 31704776704 (29.53 GB)
 DFS Used: 118906880 (113.4 MB)
 Non DFS Used: 16464519168 (15.33 GB)
 DFS Remaining: 15121350656(14.08 GB)
 DFS Used%: 0.38%
 DFS Remaining%: 47.69%
 Last contact: Fri Jun 29 16:58:05 CST 2012Name: 192.168.5.56:50010
 Decommission Status : Decommission in progress
 Configured Capacity: 29485654016 (27.46 GB)
 DFS Used: 36864 (36 KB)
 Non DFS Used: 12167548928 (11.33 GB)
 DFS Remaining: 17318068224(16.13 GB)
 DFS Used%: 0%
 DFS Remaining%: 58.73%
 Last contact: Fri Jun 29 16:58:05 CST 2012


通过网页http://192.168.5.54:50070也能查看到:

因为我hdfs文件系统上的数据不是很多,这个状态表明后台正在进行块移动。如果完成后状态则会变成
Decommissioned的字样, 当然这个得看你的文件系统的数据量大小决定的。还有一个很重要的说一下,你的备份份数必须小于或者等于你要踢除后所有正常datanode的数量,不然你 的Decommissioned in Progress这个状态会一直永远下去。这样也就得出一个公式如下:
备份份数<踢除不正常datanode节点后所有正常datanode节点的总和   或者
备份份数=踢除不正常datanode节点后所有正常datanode节点的总和
我这很快就变成了这个状态:

Name: 192.168.5.56:50010
 Decommission Status : Decommissioned
 Configured Capacity: 0 (0 KB)
 DFS Used: 0 (0 KB)
 Non DFS Used: 0 (0 KB)
 DFS Remaining: 0(0 KB)
 DFS Used%: 100%
 DFS Remaining%: 0%
 Last contact: Thu Jan 01 08:00:00 CST 1970

再查看网页被移除的节点就查看不到了(这我就懒得截图了),这样基本就完成了按正规流程移除集群中的datanode。下面介绍机器修好了,我要怎么加入到集群中来。
1、新加的节点上启动tasktracker进程

[root@slave1 ~]#  Hadoop/bin/hadoop-daemon.sh start tasktracker
 starting tasktracker, logging to/root/hadoop/bin/../logs/hadoop-root-tasktracker-slave1.out
 jps查看一下,不放心的可以ps -ef | grep java看一下:
 [root@slave1 ~]# jps
 17528 TaskTracker
 17571 Jps
 2、这个时候我们不能直接启动datanode进程,我们可以试试看:
 [root@slave1 ~]# hadoop/bin/hadoop-daemon.sh start datanode
 starting datanode, logging to/root/hadoop/bin/../logs/hadoop-root-datanode-slave1.out
 [root@slave1 ~]# jps
 17528 TaskTracker
 17811 Jps
 17761 DataNode
 [root@slave1 ~]#jps                 =====> datanode进程直接马上消失。可以查看日志为什么?
 17829 Jps
 17528 TaskTracker


3、修改namenode的core-site.xml文件,把我们刚刚加入的内容删除或者注释掉,我这里选择注释掉。

<!--
     <property>
          <name>dfs.hosts.exclude</name>
          <value>/root/hadoop/conf/excludes</value>
          <final>true</final>
     </property>
 -->


4、再执行重载namenode的配置文件

[root@master ~]# hadoop/bin/hadoop dfsadmin -refreshNodes


5、最后去启动datanode上的datanode进程

[root@slave1 ~]# hadoop/bin/hadoop-daemon.sh start datanode
 starting datanode, logging to/root/hadoop/bin/../logs/hadoop-root-datanode-slave1.out
 [root@slave1 ~]# jps
 17931 Jps
 17528 TaskTracker
 17878 DataNode
 [root@slave1 ~]# jps         ====>正常了!
 17528 TaskTracker
 17878 DataNode
 17953 Jps