本节介绍如何调优阿里云E-MapReduce HDFS的Balancer参数。

问题

如何使用E-MapReduce HDFS的Balancer功能以及参数调优?

回答

HDFS Balancer主要用来防止节点数据分布过度不均衡,平摊DataNode压力,同时计算也可以利用HDFS的Locality特性达到更高的性能,尤其在节点扩容之后,新增了大量的空节点,及时进行平衡操作,可以更好地发挥Hadoop集群性能。

  1. 登录到待配置集群的任意节点。

  2. 执行以下操作,切换到hdfs用户并执行Balancer参数。

    su hdfs
    /usr/lib/hadoop-current/sbin/start-balancer.sh -threshold 10
  3. 执行以下操作,查看balancer否在运行。

    less /var/log/hadoop-hdfs/hadoop-hdfs-balancer-emr-header-xx.cluster-xxx.log

    或者

    tailf /var/log/hadoop-hdfs/hadoop-hdfs-balancer-emr-header-xx.cluster-xxx.log
    说明 当提示信息包含Successfully字样时,表示执行成功。

Balancer的主要参数:

参数 说明
Threshold

默认值为10%,意思是上下浮动10%,即相差20%认为是平均的。

当集群总使用率较高时,需要调小Threshold,避免阈值过高。如果总体利用率不高,较低的阈值会产生更多调整,最终效果也不一定有特别明显的提升。当集群新增较多节点时,可以适当增加Threshold,让数据从高使用率节点移向低使用率的节点,随着Balancer的运行,需要逐步减少,保证数据移出节点的数量是足够的,有足够的并发。

dfs.datanode.balance.max.concurrent.moves

值默认值为是5。

表示一个DataNode节点并发移动的最大个数,一般考虑和磁盘数匹配,推荐在 DataNode端设置为 (4 * 磁盘数)作为上限,可用Balancer的值进行调节。

例如:一个DataNode有28块盘,在balancer端设置为28,DataNode端设置为28*4。具体使用时根据集群负载,观察相关指标,进行适当调整。在负载较低时,增加concurrent数,在负载较低时,减少concurrent数。这个设置在Datanode上和Balancer上都有,如果不一致时以较小的值生效。
说明 DataNode端需要重启来刷新配置。
dfs.balancer.dispatcherThreads

Balancer会在移动Block之前,每次迭代会查询出一个Block列表,分发给Mover线程使用。

说明 dispatcherThreads是这个分发线程的个数,默认为200。
dfs.balancer.rpc.per.sec

默认值为20,即每秒发送的rpc数量为20。

因为分发线程会调用大量的getBlocks的rpc查询,为了避免分发线程对NameNode造成过大压力,针对分发线程rpc发送速度进行控制,可在负载高的集群进行调整,例如减小10或者5,对整体移动进度不会产生特别大的影响。

dfs.balancer.getBlocks.size

Balancer会在移动Block之前,每次迭代时查询出一个Block列表,给Mover线程使用,默认Block列表中Block的大小为2GB。因为getBlocks这个过程会对RPC进行加锁,可以根据NameNode压力进行调整。

dfs.balancer.moverThreads

默认值为1000。

表示Balancer处理移动Block的线程数,每个Block移动时会使用用一个线程。

dfs.namenode.balancer.request.standby

默认值为false。

表示Balancer是否在 standby NameNode上查询要移动的Blocks,因为此类查询会对NameNode加锁,导致写文件时间较长,HA 集群开启后只会在 Standby NameNode上进行查询。

dfs.balancer.getBlocks.min-block-size

Balancer查询需要移动的参数时,对于较小 block(默认10MB),移动起来效率较低,通过此参数过滤掉较小的数据块,增加查询效率。

dfs.balancer.max-iteration-time

默认值为1200000,单位毫秒。

Balancer 在一次迭代的最长时间,超过后将进入下一次迭代。

dfs.balancer.block-move.timeout

默认值为0,默认为不开启,单位毫秒。

Balancer在移动 Block 时,会出现由于个别数据块没有完成而导致迭代较长情况,您可以通过此参数对移动长尾进行控制。

DataNode的主要参数:

参数 说明
dfs.datanode.balance.bandwidthPerSec

默认值为1MB/s。

表示DataNode用于Balancer的带宽,一般推荐使用100MB/s 以上进行快速平衡,也可以观察一下集群负载,适当进行调整,可通过设置dfsadmin -setBalancerBandwidth 参数,不需要重启DataNode。

例如白天负载很低,就增加Balancer的带宽;在负载高的时候减少一些。

dfs.datanode.balance.max.concurrent.moves

表示DataNode上同时用于Balancer待移动block的最大线程个数。