Mapreduce 读取Hbase,写入hbase IO 不均衡问题
硬件环境:h46、h47、h48 三个节点 2cpu 4核 共8个核心 14G 内存
软件环境:
三台机器分别部署Hadoop、hbase 并同时作为datanode 和 tasktracker regionserver、HQuorumPeer;
H46同时为Namenode、Jobtracker 和HMaster 和HQuorumPeer
出现问题:跑mapreduce 时使用 iostat 1| grep sdb 查看各节点的Io情况,发现h46有和适量的IOWrite h48 的IOWrite 也在核实范围内,唯独h47 基本没有IO。
查找原因:mapreduce 执行报告中如下提示
Launched map tasks=207
local map tasks=92
意思是大多数map 的数据都不是本地的,根据原因查找数据量比较大的task 去查看其具体执行情况。
All Task Attempts
Task Attempts
Machine
attempt_201212071915_1816_m_000225_0
/default-rack/h47
意思是此task 是交给h47 来执行,没有问题,但47为什么没有IO呢
看下面
Input Split Locations
/default-rack/h48
也就是说 这个任务的数据是h48的
为什么出现这种情况呢,为什么非要从48 远程来跑task呢。
具体查看一下 .META.信息表 就可以看到,每个region 都是由具体的一个regionserver来管理,具体是哪个 是在每个region 的映射中的info:server 字段来指定。
可以查看 其实我的所有region 并没有给h47的regionserver 来管理,所以h47 就没有IO
产生原因:
具体就看hmaster 是如何分配regions 的
目前动态分配region是由master来分配,使用的是随机分配regions
而Hbase的 DefaultLoadBalance 是按照整体负载均衡的方式来分配region 的,而不是按照其中每张表所占的region 进行均衡banlance,导致每张表可能会不均等的分配到不同的region 上。
所以就会出现 上面的情况,我们所访问的hbase 表region 分配不均衡,但分配给具体TaskTracker的任务,而region 又不归它管,导致local map tasks<< Launched map tasks=207