hadoop的balancer

在线上的hadoop集群运维过程中,hadoop 的balance工具通常用于平衡hadoop集群中各datanode中的文件块分布,以避免出现部分datanode磁盘占用率高的问题(这问题也很有可能导致该节点CPU使用率较其他服务器高)。

     1) hadoop balance工具的用法:

[html]  view plain copy
  1. To start:  
  2. bin/start-balancer.sh [-threshold <threshold>]  
  3. Example: bin/ start-balancer.sh  
  4. start the balancer with a default threshold of 10%  
  5. bin/ start-balancer.sh -threshold 5  
  6. start the balancer with a threshold of 5%  
  7.   
  8. To stop:  
  9. bin/ stop-balancer.sh   
      2)影响hadoop balance工具的几个参数:

             -threshold 默认设置:10,参数取值范围:0-100,参数含义:判断集群是否平衡的目标参数,每一个 datanode 存储使用率和集群总存储使用率的差值都应该小于这个阀值 ,理论上,该参数设置的越小,整个集群就越平衡,但是在线上环境中,hadoop集群在进行balance时,还在并发的进行数据的写入和删除,所以有可能无法到达设定的平衡参数值。

            dfs.balance.bandwidthPerSec  默认设置:1048576(1 M/S),参数含义:设置balance工具在运行中所能占用的带宽,设置的过大可能会造成mapred运行缓慢

     3)hadoop balance工具其他特点:

           balance工具在运行过程中,迭代的将文件块从高使用率的datanode移动到低使用率的datanode上,每一个迭代过程中移动的数据量不超过下面两个值的较小者:10G或者指定阀值*容量,且每次迭代不超过20分钟。每次迭代结束后,balance工具将更新该datanode的文件块分布情况。以下为官方文档英文描述:

The  tool moves  blocks from  highly utilized datanodes  to  poorly utilized datanodes
iteratively. In each iteration a datanode moves or receives no more than the lesser of 10G
bytes or the threshold fraction of its capacity. Each iteration runs no more than 20
minutes. At the end of each iteration, the balancer obtains updated datanodes information
from the namenode.


但是这里我们要讨论的是一个datanode内部的数据平衡,简单来说就是一个node如果我们有多个数据分区被hadoop使用,那么这些数据分区之间是不是也将被balancer自动平衡呢?答案是否定的!hadoop balancer不会自动平衡node内部的数据,也就是说,如果遇到我们上述的情况,hadoop根本不会管理,而是只是考虑数据的总量!
于是现在问题就来了,hadoop在写入数据的时候采用的平衡写入的方式,也就是说如果我们有两个partition被hadoop使用存储数据:
/data1 100%  total 100GB
/data2 10%   total 100GB
那么结果将是hadoop还是将数据尝试平分到两个分区,但是由于第一个分区已经用完,这是后hadoop则会放弃在这个node存储更多的数据!!
这个绝对是我们不想要的结果,但是有什么办法可以解决这个问题呢?

搜索了一下官方的文档以后我发现了答案:
http://wiki.apache.org/hadoop/FAQ#On_an_individual_data_node.2C_how_do_you_balance_the_blocks_on_the_disk.3F
其实hadoop node内部的数据存放是非常简单的,没一个数据块都是有一个meta data的文件维持.*(什么是数据块请参考hadoop dfs相关文献)
所以举例:
数据块 A 一定有一个叫 A.meta的文件维持其在hadoop dfs中的存放.
简单的来说就是,hadoop将大数据文件split成小文件块,default size是64MB~ (这里有一个hadoop小文件problem,请参考相关资料)
每一个数据块都需要有一个meta文件以便让hadoop dfs方便的知道这个数据块的内容,这样hadoop dfs就不需要完全的读出整个数据块的内容就可以轻易的在我
们需要找到他的时候快速的找出(里面用到了Hash以及Indexing的有关算法,有兴趣可以查看相关的文档)
那么现在的问题就是,我们怎样自己把文件转移到另一个分区.
根据官方的说法:
Hadoop currently does not have a method by which to do this automatically. To do this manually:
Take down the HDFS
Use the UNIX mv command to move the individual blocks and meta pairs from one directory to another on each host
Restart the HDFS
也就是,我们service down datanode,然后使用类似mv的命令将数据块和相关的meta文件同时复制到另一个分区即可!
操作是非常简单的,但是一定要记住,在转移的过程中一定要关闭datanode service, 尽量也关闭tasktracker service.
因为如果在datanode service还在运行的时候我们就转移文件的话,hadoop dfs非常可能崩溃~而且有可能是不可恢复的!

另外一个小提醒:
如果在转移文件的时候我们还有其他的hadoop job在运行,我们还是可以直接关闭某一个node的datanode service, 因为hadoop default的data replica = 2
也就是说我们shutdown这个node以后,其他的node还是有这个node上所有的数据备份.
但是我们最好不要同时shutdown多个node,因为这样或许会影响hadoop job的正常运行
转自:http://www.cnblogs.com/linehrr-freehacker/p/3311878.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值