Winse Blog

走走停停, 熙熙攘攘, 忙忙碌碌, 不知何畏.

Hadoop的datanode数据节点软/硬件配置应该一致

最好的就是集群的所有的datanode的节点的硬件配置一样!当然系统时间也的一致,hosts等等这些。机器配置一样时可以使用脚本进行批量处理,给维护带来很大的便利性。

今天收到运维的信息,说集群的一台机器硬盘爆了!上到环境查看df -h发现硬盘配置和其他datanode的不同!但是hadoop hdfs-site.xml的dfs.datanode.data.dir却是一样的!

经验: dir的配置应该是一个系统设备对应一个路径,而不是一个系统目录对应dir的一个路径!

问题现象以及根源

问题机器A的磁盘情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[hadoop@hadoop-slaver8 ~]$ df -h
文件系统              容量  已用  可用 已用%% 挂载点
/dev/sda3             2.7T  2.5T   53G  98% /
tmpfs                  32G  260K   32G   1% /dev/shm
/dev/sda1              97M   32M   61M  35% /boot

[hadoop@hadoop-slaver8 /]$ ll
总用量 170
dr-xr-xr-x.   2 root   root    4096 2月  12 19:39 bin
dr-xr-xr-x.   5 root   root    1024 2月  13 02:40 boot
drwxr-xr-x.   2 root   root    4096 2月  23 2012 cgroup
drwxr-xr-x.   3 hadoop hadoop  4096 6月  30 10:36 data1
drwxr-xr-x.   3 hadoop hadoop  4096 6月  30 10:36 data10
drwxr-xr-x.   3 hadoop hadoop  4096 6月  30 10:36 data11
drwxr-xr-x.   3 hadoop hadoop  4096 6月  30 10:36 data12
drwxr-xr-x.   3 hadoop hadoop  4096 6月  30 10:36 data13
drwxr-xr-x.   3 hadoop hadoop  4096 6月  30 10:36 data14
drwxr-xr-x.   3 hadoop hadoop  4096 6月  30 10:36 data15
drwxr-xr-x.   3 hadoop hadoop  4096 6月  30 10:36 data2
drwxr-xr-x.   3 hadoop hadoop  4096 6月  30 10:36 data3
drwxr-xr-x.   3 hadoop hadoop  4096 6月  30 10:36 data4
drwxr-xr-x.   3 hadoop hadoop  4096 6月  30 10:36 data5
drwxr-xr-x.   3 hadoop hadoop  4096 6月  30 10:36 data6
drwxr-xr-x.   3 hadoop hadoop  4096 6月  30 10:36 data7
drwxr-xr-x.   3 hadoop hadoop  4096 6月  30 10:36 data8
drwxr-xr-x.   3 hadoop hadoop  4096 6月  30 10:36 data9

再看集群其他机器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[hadoop@hadoop-slaver1 ~]$ df -h
文件系统              容量  已用  可用 已用%% 挂载点
/dev/sda3             2.7T   32G  2.5T   2% /
tmpfs                  32G   88K   32G   1% /dev/shm
/dev/sda1              97M   32M   61M  35% /boot
/dev/sdb1             1.8T  495G  1.3T  29% /data1
/dev/sdb2             1.8T  485G  1.3T  28% /data2
/dev/sdb3             1.8T  492G  1.3T  29% /data3
/dev/sdb4             1.8T  488G  1.3T  28% /data4
/dev/sdb5             1.8T  486G  1.3T  28% /data5
/dev/sdb6             1.8T  480G  1.3T  28% /data6
/dev/sdb7             1.8T  479G  1.3T  28% /data7
/dev/sdb8             1.8T  474G  1.3T  28% /data8
/dev/sdb9             1.8T  480G  1.3T  28% /data9
/dev/sdb10            1.8T  478G  1.3T  28% /data10
/dev/sdb11            1.8T  475G  1.3T  28% /data11
/dev/sdb12            1.8T  489G  1.3T  29% /data12
/dev/sdb13            1.8T  475G  1.3T  28% /data13
/dev/sdb14            1.8T  476G  1.3T  28% /data14
/dev/sdb15            1.8T  469G  1.3T  27% /data15

出问题机器没有挂存储,仅仅是建立了对应的目录结构,并不是把目录挂载到单独的存储设备上。

同时查看50070的前面的信息,hadoop把每个逗号分隔后的路径默认都做一个磁盘设备来计算!

1
2
3
Node               Address             ..Admin State CC    Used  NU    RU(%) R(%)      Blocks Block  Pool Used Block Pool Used (%)
hadoop-slaver1    192.168.32.21:50010 2   In Service  26.86   7.05    1.37    18.44   26.25       68.66   264844  7.05    26.25   
hadoop-slaver8    192.168.32.28:50010 1   In Service  37.94   2.46    34.71   0.77    6.48        2.03    29637   2.46    6.48    

配置容量是所有配置的路径所在盘容量的累加。总的剩余空间(余量)也是各个dir配置路径的剩余空间累加的!这样很容易出现问题! 最好的就是集群的所有的datanode的节点的硬件配置一样!当然系统时间也的一致,hosts等等这些。

问题处理

首先得把问题解决啊:

  • dfs.datanode.data.dir路径个数调整为磁盘个数!
  • 修改该datanode的hdfs-site的配置,添加dfs.datanode.du.reserved,留给系统的空间设置为400多G。
  • 冗余份数也没有必要3份,浪费空间。如果两台机器同时出现问题,还是同一份数据,那只能说是天意!你可以去趟澳门赌一圈了!
1
2
3
4
5
6
7
8
9
10
11
12
<property>
<name>dfs.datanode.data.dir</name>
<value>/data1/hadoop/data</value>
</property>
<property>
<name>dfs.datanode.du.reserved</name>
<value>437438953472</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>

设置了reserved保留空间后,再看LIVE页面slaver8的容量变少了且正好等于(盘的容量2.7T-430G~=2.26T 计算容量的hdfs源码在FsVolumeImpl.getCapacity())。

1
hadoop-slaver8   192.168.32.28:50010 1   In Service  2.26    2.23    0.00    0.03    98.66

datanode和blockpool的平衡处理,可以参考Live Datanodes的容量和进行!

1
2
3
4
5
6
7
[hadoop@hadoop-master1 ~]$ hdfs balancer -help
Usage: java Balancer
        [-policy <policy>]      the balancing policy: datanode or blockpool
        [-threshold <threshold>]        Percentage of disk capacity

[hadoop@hadoop-slaver8 ~]$ hadoop-2.2.0/bin/hdfs getconf -confkey dfs.datanode.du.reserved
137438953472

删除一些没用的备份数据。配置好以后,重启当前slaver8节点,并进行数据平衡(如果觉得麻烦,直接丢掉原来的一个目录下的数据也行,可能更快!均衡器运行的太慢!!)

1
2
3
4
5
6
7
8
9
[hadoop@hadoop-slaver8 ~]$  ~/hadoop-2.2.0/sbin/hadoop-daemon.sh stop datanode

[hadoop@hadoop-slaver8 ~]$  for i in 6 7 8 9 10 11 12 13 14 15; do  cd /data$i/hadoop/data/current/BP-1414312971-192.168.32.11-1392479369615/current/finalized;  find . -type f -exec mv {} /data1/hadoop/data/current/BP-1414312971-192.168.32.11-1392479369615/current/finalized/{} \;; done

[hadoop@hadoop-slaver8 ~]$  ~/hadoop-2.2.0/sbin/hadoop-daemon.sh start datanode


[hadoop@hadoop-master1 ~]$ hdfs dfsadmin -setBalancerBandwidth 10485760
[hadoop@hadoop-master1 ~]$ hdfs balancer -threshold 60

查看datanode的日志,由于移动数据,有些blk的id一样,会清理一些数据。对于均衡器程序的阀值越小集群越平衡!默认是10(%),会移动很多的数据(准备看下均衡器的源码,了解各个参数以及运行的逻辑)!

参考

–END

Comments