一 、准备工作
1 了解hdfs写数据的副本机制,数据倾斜的可能情况
以默认的副本数=3为例:
1)第一个副本块保存在客户端所在的 DataNode 上;
2)第二个副本块保存在客户端所在 DataNode 同机架内的其他 DataNode 上;
3)第三个副本块保存不同机架的某个 DataNode 上。
2 准备数据,制造数据倾斜
在某一个dn节点的客户端上传大量数据,会导致当前dn的使用率高于其他节点
3 了解 Balancer工具
Balancer工具可以用来分析块的分布情况,并且可以重新分配DataNode中的数据。
HDFS命令语句如下。
hdfs balancer [-threshold <threshold>] [-policy <policy>] [-exclude [-f <hosts-file> | <comma-separatedlistofhosts>]] [-include [-f <hosts-file> | <comma-separatedlistofhosts>]] [-source [-f <hosts-file> | <comma-separatedlistofhosts>]] [-blockpools <comma-separatedlistofblockpoolids>] [-idleiterations <idleiterations>]
二、使用Balancer
1、登录到客户端节点
2、切换到hdfs用户并执行Balancer参数。
/usr/lib/hadoop-current/sbin/start-balancer.sh -threshold 5
3、执行以下命令,进入hadoop-hdfs目录。
cd /var/log/hadoop-hdfs
4、执行ll命令,查看Balancer日志。
5、执行以下命令,查看Balancer运行情况。
tail -f /var/log/hadoop-hdfs/hadoop-hdfs-balancer-emr-header-xx.cluster-xxx.log
由于迁移的数据比较多,这个均衡会在后台执行,日志中会一直刷新如下迁移过程中的打印:
刷新节点的使用率,当前节点的磁盘使用率一直在下降的过程中
执行完以后的日志:
均衡后的结果:
三、常见问题
1 如上图的截图,为什么设置threshold为5 均衡以后,各个节点之间的最大值和最小值相差却大于5?
这是因为,在均衡的时候,会计算一个平均值,比如一开始的
50.84/4 = 12.71 ,那么其实只会迁移 12.71+ 5 =17.71 的往上部分的数据。
而迁移完的数据,16.89已经小于17.71,所以集群认为各个节点之间已经均衡。
2 因为迁移时会占用集群资源,并且并不是左右节点都需要做均衡的,如果只是想均衡使用率很高和使用率很低的节点之间的数据,应该怎么办呢?
是可以通过blockpools参数,指定部分节点间做数据均衡的。