动态扩容,顾名思义,就是通过增加节点实现集群服务能力的提升。是hadoop,或者说分布式集群的特性之一;

同理,部分节点可能老化,升级换代,节点需要对应的下线处理。今天就分别介绍这两部分操作:

1,动态扩容

1.1,在新增节点配置环境,可以参考Hadoop集群的搭建 里如何配置节点,主要是配置ssh免密登录,配置java环境。步骤都是一样的,不在赘述。

1.2,在主节点修改hosts文件,增加新增节点,并同步到集群所有节点

[hadoop@server45 hadoop]$ cat /etc/hosts

10.1.197.50 server50
10.1.197.51 server51
10.1.197.41 server41
10.1.197.42 server42
10.1.197.43 server43
10.1.197.44 server44
10.1.197.45 server45

1.3,修改 hadoop目录下的etc/hadoop/下的slaves文件,增加新节点

[hadoop@server45 hadoop]$ cat slaves 
server45
server44
server43
server42
[hadoop@server45 hadoop]$ pwd
/opt/bigdata/hadoop/hadoop-2.6.5/etc/hadoop

1.4,从主节点将hadoop安装目录scp一份到目的节点

可以通过dfs.hosts属性配置可以连接到namenode的节点白名单,我们这里不做这个,默认全部。

1.5,在新节点启动datanode

hadoop-daemon.sh start datanode

[hadoop@server42 sbin]$ ./hadoop-daemon.sh  start datanode
starting datanode, logging to /opt/bigdata/hadoop/hadoop-2.6.5/logs/hadoop-hadoop-datanode-server42.out
[hadoop@server42 sbin]$ jps
5813 DataNode
5935 Jps

1.6,在监控页面可以看到新增节点

hadoop 内存调优参数 hadoop 扩容_hadoop

这里可以看到新加入的节点没有数据块,因此需要对hdfs进行负载均衡操作。

这里涉及两个问题:

1,集群默认的数据传输带宽比较低,是1M/s,可以通过如下命令提高:

hdfs dfsadmin -setBalancerBandwidth 128000000

2,默认balancer的threshold为10%,即各个节点与集群总的存储使用率相差不超过10%

sbin/start-balancer.sh -threshold 5,等待集群自均衡完成即可

[hadoop@server45 sbin]$ ./start-balancer.sh -threshold 5
starting balancer, logging to /opt/bigdata/hadoop/hadoop-2.6.5/logs/hadoop-hadoop-balancer-server45.out
[hadoop@server45 sbin]$ 
[hadoop@server45 sbin]$ more /opt/bigdata/hadoop/hadoop-2.6.5/logs/hadoop-hadoop-balancer-server45.out
Time Stamp               Iteration#  Bytes Already Moved  Bytes Left To Move  Bytes Being Moved
The cluster is balanced. Exiting...
Feb 28, 2020 11:23:35 AM          0                  0 B                 0 B               -1 B
Feb 28, 2020 11:23:35 AM Balancing took 1.357 seconds
 -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65536
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 131072
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[hadoop@server45 sbin]$

执行日志里提示我们

The cluster is balanced. Exiting...

3,启动nodemanager

yarn-daemon.sh start nodemanager

在主节点,通过yarn node -list 查看新增的nodemanager节点

[hadoop@server45 hadoop]$ yarn node -list
20/03/02 09:24:12 INFO client.RMProxy: Connecting to ResourceManager at server45/10.1.197.45:18040
20/03/02 09:24:12 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Total Nodes:4
         Node-Id	     Node-State	Node-Http-Address	Number-of-Running-Containers
  server42:16288	        RUNNING	    server42:8042	                           0
  server43:44932	        RUNNING	    server43:8042	                           0
  server45:63166	        RUNNING	    server45:8042	                           0
   server44:5639	        RUNNING	    server44:8042	                           0

 

2,动态缩容

1,添加配置退役节点

在namenode节点hadoop配置目录etc/hadoop下增加文件excludes,文件加入需要下线的节点,类似slaves一样。

这里我们把server44节点下线

[hadoop@server45 hadoop]$ pwd
/opt/bigdata/hadoop/hadoop-2.6.5/etc/hadoop
[hadoop@server45 hadoop]$ cat excludes 

server44

2,在namenode的hdsf-site.xml文件中新增配置项

<property>
<name>dfs.hosts.exclude</name>
<value>/opt/bigdata/hadoop/hadoop-2.6.5/etc/hadoop/excludes</value>
</property>

dfs.hosts.exclude属性的意义:
命名一个文件,其中包含不允许连接到namenode的主机列表。如果值为空,则不排除任何主机。

3,刷新集群

在namenode所在的机器执行以下命令,刷新namenode,刷新resourceManager。
hdfs dfsadmin -refreshNodes
yarn rmadmin –refreshNodes

可以看到server44节点状态是 decommission in progress

hadoop 内存调优参数 hadoop 扩容_hdfs_02

同步完成后:状态变为Decommissioned

hadoop 内存调优参数 hadoop 扩容_Hadoop_03

等待退役节点状态为decommissioned(所有块已经复制完成),停止该节点及节点资源管理器。注意:如果副本数是3,服役的节点小于等于3,是不能退役成功的,需要修改减少副本数后才能退役。

在退役节点server44执行以下命令,停止该节点进程

sbin/hadoop-daemon.sh stop datanode

sbin/yarn-daemon.sh stop nodemanager

namenode所在节点执行以下命令刷新namenode和resourceManager

hdfs dfsadmin –refreshNodes

yarn rmadmin –refreshNodes

namenode所在节点执行以下命令进行均衡负载

sbin/start-balancer.sh

 

 

===》意外情况:

[hadoop@server44 sbin]$ ./hadoop-daemon.sh  stop datanode
no datanode to stop

执行stop命令的时候返回:no datanode to stop,检查发现集群的配置文件与主节点的配置文件的dfs.namenode.name.dir不一致,datanode的clusterID 和 namenode的 clusterID 不匹配。

解决办法:

1、 打开dfs.namenode.name.dir 配置对应目录下的 current 目录下的 VERSION 文件,拷贝clusterID;
2、 打开dfs.namenode.data.dir 配置对应目录下的 current 目录下的 VERSION 文件,用拷贝的 clusterID 覆盖原有的clusterID;
3、 保存后重新启动 hadoop,datanode 进程就能正常执行命令了。

这里节点既然已经下线,数据块也已经复制完成,可以粗暴点直接kill掉进程。

 

感谢:


提高Hadoop Balancer 迁移block速度的方法

Hadoop数据倾斜,快速精确balance的方法