动态扩容,顾名思义,就是通过增加节点实现集群服务能力的提升。是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,在监控页面可以看到新增节点
这里可以看到新加入的节点没有数据块,因此需要对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
同步完成后:状态变为Decommissioned
等待退役节点状态为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的方法