Hadoop/HBase集群移除节点

By | 2019年2月2日
原创作品,允许转载,转载时请务必以超链接形式标明文章

原始出处
、作者信息和本声明。否则将追究法律责任。http://shitouer.cn/2013/03/hadoop-or-hbase-cluster-remove-nodes/

线上HBase集群操作系统需要升级,不能停止服务,且无其他多余机器可用,便采用“从集群移除节点–>升级节点机器–>节点加入集群”方法来进行。

集群上既部署有Hadoop,又部署有HBase,因为HBase存储是基于Hadoop HDFS的,所以先要移除HBase节点,之后再移除Hadoop节点。添加则反之。

一. 卸载HBase节点

1. 在0.90.2之前,我们只能通过在要卸载的节点上执行

$ ./bin/hbase-daemon.sh stop regionserver

来实现。这条语句执行后,该RegionServer首先关闭其负载的所有Region而后关闭自己。在关闭时,RegionServer在ZooKeeper中的“Ephemeral Node”会失效。此时,Master检测到RegionServer挂掉并把它作为一个宕机节点,并将该RegionServer上的Region重新分配到其他RegionServer。

注意:使用此方法前,一定要关闭HBase Load Balancer。关闭方法:

hbase(main):001:0> balance_switch false
true
0 row(s) in 0.3590 seconds

总结:这种方法很大的一个缺点是该节点上的Region会离线很长时间。因为假如该RegionServer上有大量Region的话,因为Region的关闭是顺序执行的,第一个关闭的Region得等到和最后一个Region关闭并Assigned后一起上线。这是一个相当漫长的时间。以我这次的实验为例,现在一台RegionServer平均有2000个Region,每个Region Assigned需要4s,也就是说光Assigned就至少需要2个小时。

2.自0.90.2之后,HBase添加了一个新的方法,即“graceful_stop”,只需要在HBase Master节点执行:

./bin/graceful_stop.sh hostname

该命令会自动关闭Load Balancer,然后Assigned Region,之后会将该节点关闭。除此之外,你还可以查看remove的过程,已经assigned了多少个Region,还剩多少个Region,每个Region 的Assigned耗时。

补充graceful stop的一些其他命令参数:

$ ./bin/graceful_stop.sh
Usage: graceful_stop.sh [--config &conf-dir>] [--restart] [--reload] [--thrift] [--rest] &hostname>
 thrift      If we should stop/start thrift before/after the hbase stop/start
 rest        If we should stop/start rest before/after the hbase stop/start
 restart     If we should restart after graceful stop
 reload      Move offloaded regions back on to the stopped server
 debug       Move offloaded regions back on to the stopped server
 hostname    Hostname of server we are to stop

1. 2. 最终都需要我们手动打开load balancer:

hbase(main):001:0> balance_switch true
false
0 row(s) in 0.3590 seconds

 注:强烈建议使用“graceful_stop”来移除节点。

至此,HBase节点已经卸载完成,将卸载Hadoop节点。

二. 卸载Hadoop节点

1. 在namenode节点的hadoop部署目录下的conf目录下新建一个excludes(文件名可以随意)文件:

vim $HADOOP_HOME/conf/excludes

slave2

如要remove多个则每行写一个,既可以是IP,也可以是hostname。

2. 在$HADOOP_HOME/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 dfsadmin -refreshNodes

4. 查看状态,可以通过

[root@master ~]#hadoop dfsadmin -report

如下:

Name: 192.168.205.7:50010
Decommission Status : Decommission in progress
Configured Capacity: 11917033340928 (10.84 TB)
DFS Used: 7693401063424 (7 TB)
Non DFS Used: 118121652224 (110.01 GB)
DFS Remaining: 4105510625280(3.73 TB)
DFS Used%: 64.56%
DFS Remaining%: 34.45%
Last contact: Mon Mar 04 13:53:52 CST 2013

也可以直接通过Hadoop 浏览器UI查看。

>>Cluster Summary >>Decommissioning Nodes

当然,在Live Nodes里也有记录。

>>Cluster Summary >>Live Nodes

完成后,slave1显示在dead nodes中。且其上的服务停止。Live Nodes中仅剩slave2,slave3

以上即为从Hadoop集群中Remove Node的过程,但是,有一点一定要注意

hdfs-site.xml配置文件中dfs.replication值必须小于或者等于踢除节点后正常datanode的数量,即:dfs.replication <= 集群所剩节点数

三、重新加入该节点

下面第一步和第二步必须做,否则的话,datanode启动不起来。

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

<!--

<property>

<name>dfs.hosts.exclude</name>

<value>/root/hadoop/conf/excludes</value>

<final>true</final>

</property>

-->

2. 再执行重载namenode的配置文件

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

3. 最后去启动datanode上的datanode及tasktracker进程

[root@slave1 ~]# hadoop/bin/hadoop-daemon.sh start datanode

starting datanode, logging to /root/hadoop/bin/../logs/hadoop-root-datanode-slave1.out

[root@slave1 ~]# hadoop/bin/hadoop-daemon.sh start tasktracker

starting tasktracker, logging to /root/hadoop/bin/../logs/hadoop-root-tasktracker-slave1.out

4. 查看下全部启动了

[root@slave1 ~]# jps

17931 Jps

17528 TaskTracker

17878 DataNode

[root@slave1 ~]# jps ====>正常了!

17528 TaskTracker

17878 DataNode

17953 Jps

四、重新假如HBase RegionServer节点

只需要重启regionserver进程即可。

发表评论