Hadoop各节点负载均衡机制
Hadoop 各节点负载均衡
背景:
对于HDFS集,经常长时间的运⾏,数据量会增趋势性增长,hdfs的使⽤率会越来越饱和,此时会对hdfs进⾏扩容,⽽扩容之后为了提⾼各个datanode之间的分布式读写效率,必须实现节点之间的负载均衡。另外集经过⼤量的delete操作后,各个Datanode上的空间使⽤率可能会存在⽐较⼤的差异,少数使⽤率过⾼的Datanode会导致对其的数据访问效率变低,并且如果该Datanode挂掉,需要更多的时间进⾏恢复,对集也会造成更⼤的影响,基于此,本⽂基于hadoop⾃带的balancer机制进⾏研究。
负载均衡命令:
bin/start-balancer.sh[-threshold <threshold>]
原理解析:
通过上⾯的命令可以使Hadoop对各个Datanode进⾏评估并使他们保持平衡,参数threshold表⽰的平衡的阀值,取值范围在0%到100%之间,该参数表⽰每个Datanode中空间使⽤率与HDFS集总的空间使⽤率
的差距百分⽐,阀值设置的越⼩,那么HDFS各个Datanode的使⽤率越接近,整个集也更加的平衡,但会需要消耗更多的时间和资源来达到该平衡状态,如果阀值设置的过⼩,那么对于操作⾮常频繁的HDFS集,有可能永远也不会达到该阀值所指定的平衡状态,阀值设置的越⼤,那么HDFS各个Datanode的使⽤率差距越⼤,但是会较容易达到。
通过对源码的解析发现:整个balancer过程还是⽐较复杂的,⾸先会计算集总的使⽤率,然后分别计算各个活着的Datanode结点的使⽤率,根据balancer阀值对各个Datanode进⾏分类,到那些使⽤率过⾼的和使⽤率过低的结点。遍历使⽤率过⾼的结点,到适合迁移BLOCK的⽬标结点,原则就是最好是同⼀机架,如果当前机架没有适合的才会考虑其他机架,把BLOCK从使⽤率⾼的结点拷贝到使⽤率低的结点,在每次递归的过程中,单个Datanode转移或者接受的BLOCK不过超过10G或者它存储能⼒的阀值(根据该Datanode的总空间决定),并且每次递归过程也不能执⾏超过20分钟,在每次递归过后,会更新Datanode的最新状态信息,重新计算使⽤率,决定下⼀次递归的执⾏,整个递归过程,最多会执⾏5次。
通过参数dfs.balance.bandwidthPerSec可以现在balancer过程所占⽤的⽹络带宽,单位为每秒字节数,默认值为1M/S。如果你的集⽐较空闲或者带宽⽐较⼤,可以适当的增加该参数,来加速整个balancer过程,如果你的集⽐较繁忙或者带宽⽐较⼩,就要调⼩该参数,但这个balancer过程会变得缓慢,对该参数的参数,只有在HDFS下次启动后才可以⽣效。
单节点内部分区平衡性:
datanode内部通常会存在多个分区⽤于提供并⾏的读写请求,那么hadoop的balancer机制能实现分区层⾯的数据负载吗?答案是否定的。
hadoop分布式集搭建hadoop balancer⽬前为⽌不会⾃动平衡node内部的数据,也就是说,如果遇到我们上述的情况,hadoop根本不会管理,⽽是只是考虑数据的总量。
假设某datanode节点上有两个分区:
/data1100% total 100GB
/data2 10% total 100GB
hadoop存储数据时还是将数据尝试平分到两个分区,但是由于第⼀个分区已经⽤完,此时hadoop则会放弃在这个node存储更多的数据。这个结果是我们不愿意看到的。查阅官⽅wiki⽂档后发现如下答案:
Hadoop currentlydoes not have a method by which to do this automatically. To do this manually:
1.Take down theHDFS
2.Use the UNIXmv command to move the individual blocks and meta pairs from one directory toanother on each host
3.Restart theHDFS
即:先停掉hdfs集,然后使⽤类似mv的命令将数据块和相关的meta⽂件同时复制到另⼀个分区即可。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。