HDFS修改备份系数和动态增删节点

hadoop集群会经常遇到增删节点的情况,这里整理一下修改hdfs备份系数和增删datanode时的一些工作。

检查修改备份系数

查看文件备份数

1
2
3
4
[root@VLNX107011 hue]# hdfs dfs -ls /facishare-data/flume/test
Found 2 items
drwxr-xr-x - fsdevops fsdevops 0 2015-11-18 11:09 /facishare-data/flume/test/2015
-rw-r--r-- 2 fsdevops fsdevops 33 2015-11-30 17:49 /facishare-data/flume/test/nohup.out

结果行中的第2列是备份系数(注:文件夹信息存储在namenode节点上,没有备份,故文件夹的备份系数是横杠)

查看集群平均备份数

通过hadoop fsck /可以方便的看到Average block replication的值,这个值不一定会与Default replication factor相等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@VLNX107011 hue]# hdfs fsck /
Connecting to namenode via http://VLNX107011:50070
FSCK started by root (auth:SIMPLE) from /VLNX107011 for path / at Fri Dec 04 19:08:09 CST 2015
...................
Total size: 11837043630 B (Total open files size: 166 B)
Total dirs: 3980
Total files: 3254
Total symlinks: 0 (Files currently being written: 2)
Total blocks (validated): 2627 (avg. block size 4505916 B) (Total open file blocks (not validated): 2)
Minimally replicated blocks: 2627 (100.0 %)
Over-replicated blocks: 2253 (85.76323 %)
Under-replicated blocks: 0 (0.0 %)
Mis-replicated blocks: 0 (0.0 %)
Default replication factor: 3
Average block replication: 2.9798248
Corrupt blocks: 0
Missing replicas: 0 (0.0 %)
Number of data-nodes: 10
Number of racks: 1
FSCK ended at Fri Dec 04 19:08:09 CST 2015 in 100 milliseconds
The filesystem under path '/' is HEALTHY

可以看到Average block replication, Corrupt blocks, Missing replicas等信息。

修改备份系数

1
2
3
4
5
6
7
8
[root@VLNX107011 hue]# hdfs dfs -setrep -w 3 -R /
Replication 3 set: /user/oozie/share/lib/lib_20151103160704/hive/jetty-all-7.6.0.v20120127.jar
Replication 3 set: /user/oozie/share/lib/lib_20151103160704/hive/jline-2.11.jar
......
Waiting for /backup/gitlab/1447133001_gitlab_backup.tar ........... done
Waiting for /backup/gitlab/1447133732_gitlab_backup.tar ... done
Waiting for /backup/gitlab/1447180217_gitlab_backup.tar ... done
......

可以看到HDFS对所有文件的备份系数进行了刷新。

再次检查刚才文件的备份系数,可以看到从2变为3

1
2
3
4
[root@VLNX107011 hue]# hdfs dfs -ls /facishare-data/flume/test
Found 2 items
drwxr-xr-x - fsdevops fsdevops 0 2015-11-18 11:09 /facishare-data/flume/test/2015
-rw-r--r-- 3 fsdevops fsdevops 33 2015-11-30 17:49 /facishare-data/flume/test/nohup.out

WARNING
将备份系数从低到高比较容易,但从高到低会特别慢,所以在集群搭建初始就要规划好Default replication factor
通常备份系数不需要太高,可以是服务器总量的1/3左右即可,Hadoop默认的数值是3。

增加DataNode

添加过程略过。
增加完机器后,如果需要可以对HDFS中文件进行负载均衡。

1
2
3
[root@VLNX107011 hue]# hdfs balancer
.....
2015-12-4 19:38:46 Balancing took 18.637816666666666 minutes

删除DataNode

  1. 在配置中将此datanode添加到exclude中
    注:cloudera中配置dfs_hosts_exclude.txt 的 NameNode 高级配置代码段(安全阀)选项。
    非cloudera时,手动进行配置。
  • 修改core-site.xml
1
2
3
4
5
6
7
8
<property>
<name>dfs.hosts.exclude</name>
<value>/etc/hadoop/conf/exclude</value>
<description>Names a file that contains a list of hosts that are
not permitted to connect to the namenode. The full pathname of the
file must be specified. If the value is empty, no hosts are
excluded.</description>
</property>
  • 修改hdfs-site.xml
1
2
3
4
5
6
7
8
<property>
<name>dfs.hosts.exclude</name>
<value>/etc/hadoop/conf/exclude</value>
<description>Names a file that contains a list of hosts that are
not permitted to connect to the namenode. The full pathname of the
file must be specified. If the value is empty, no hosts are
excluded.</description>
</property>
  • 创建/etc/hadoop/conf/exclude,在文件中增加需要删除的节点,一行一个
1
2
vlnx103122
vlnx103123
  1. 动态刷新配置
1
2
3
[root@VLNX107011 hue]# hdfs dfsadmin -refreshNodes
Refresh nodes successful for VLNX107010/172.31.107.10:8020
Refresh nodes successful for VLNX107011/172.31.107.11:8020
  1. 通过web页面查看datanode情况。
    http://vlnx107010:50070/dfshealth.html#tab-datanode
    开始处于Decommissioning(退役中)状态,最后处于Dead(已下线)状态。

注意
在删除节点时一定要停止所有Hadoop的Job,否则程序还会向要删除的节点同步数据,这样也会导致Decommission的过程一直无法完成。
我自己没有试过,但应该将yarn的nodemanager停掉就好。

  1. 检查datanode和tasktracker状态,理论上datanode已经停掉,然后手动停掉tasktracker。

增加datanode磁盘

集群磁盘进行扩容,可能会采用添加节点的方式,也可能会采用增加datanode磁盘挂载的方式,对于第二种方式,需要注意以下几点:

  1. 新挂载的磁盘需要有读写权限
  2. 修改datanode数据副本存放磁盘选择策略

配置完成后,需要重启集群。

datanode数据副本存放磁盘选择策略

有两种方式:
第一种是沿用hadoop1.0的磁盘目录轮询方式,实现类:RoundRobinVolumeChoosingPolicy.java
第二种是选择可用空间足够多的磁盘方式存储,实现类:AvailableSpaceVolumeChoosingPolicy.java

具体配置在hdfs-site.xml中:

1
2
3
4
5
<property>
<name>dfs.datanode.fsdataset.volume.choosing.policy</name>
<!-- <value>org.apache.hadoop.hdfs.server.datanode.fsdataset.RoundRobinVolumeChoosingPolicy</value> -->
<value>org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy</value>
</property>

如果不配置,默认使用第一种方式,既轮询选择磁盘来存储数据副本,但是轮询的方式虽然能够保证所有磁盘都能够被使用,但是经常会出现各个磁盘直接数据存储不均衡问题,有的磁盘存储得很满了,而有的磁盘可能还有很多存储空间没有得到利用,所有在hadoop2.0集群中,最好将磁盘选择策略配置成第二种,根据磁盘空间剩余量来选择磁盘存储数据副本,这样一样能保证所有磁盘都能得到利用,还能保证所有磁盘都被利用均衡。

使用第二种方式时,同时需要配置另外两个参数:

  1. dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold, 默认值是10737418240,既10G,一般使用默认值就行。首先计算出两个值,一个是所有磁盘中最大可用空间,另外一个值是所有磁盘中最小可用空间,如果这两个值相差小于该配置项指定的阀值时,则就用轮询方式的磁盘选择策略选择磁盘存储数据副本。
  2. dfs.datanode.available-space-volume-choosing-policy.balanced-space-preference-fraction, 默认值是0.75f,一般使用默认值就行。有多少比例的数据副本应该存储到剩余空间足够多的磁盘上。该配置项取值范围是0.0-1.0,一般取0.5-1.0,如果配置太小,会导致剩余空间足够的磁盘实际上没分配足够的数据副本,而剩余空间不足的磁盘取需要存储更多的数据副本,导致磁盘数据存储不均衡。