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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/d4483978b751d5fe633dc33a7b1bffe9.html