日期:2014-05-16  浏览次数:20454 次

HBase 之mapreduce 提升
    最近在研究如何利用Mapreduce架构处理HBase中的数据。总体来看有以下两种方法:
1)借助HBase提供的package:org.apache.hadoop.hbase.mapreduce。目前package的性能不是很优,下文将详述;
2)借助Hive提供的hbase-handler,利用hive来处理后base的数据,但是hbase-handler依然依赖1)中的package,自然存在同样的问题。
    本文旨在对方法1)进行提升,提出一个思路,希望大家多多讨论,给出意见建议。

    第1)种方法,HBase的提供的Mapreduce将待处理的HTable按照region的start/end key进行split。每个Mapper处理一个region的数据。
    这种split任务的想法比较直接,因为每个Region的start/end key都比较容易得到,package中提供的代码是通过读取.META.表获取的。实际上还可以通过htable的regioninfo获取,或者直接从HFile中获取(这种方法下面将会具体详述)。然而,我觉得这种split的方式不是很合理,设想:
    HTable的region的个数不多,远少于集群中node的个数,但是每个region都很庞大,远大于默认的256M。
    那么每个处理Mapper的node将要处理过多的任务,同时又会有很多node的资源得不到Mapper任务——总之,无法根据集群处理的能力合理地分配任务。
    实际上我们需要对每个region中的数据进一步划分,从而产生更多的mapper任务,以供较多的node处理。这需要我们对每个region都获取更多的key作为split的边界,我们称之为采样key。问题在于,我们可以容易地获得每个region的start/end key,但却无法容易地、直接地获得更多的采样key :(
    事实上,我们可以从HFile中比较直接地获取一些key。通过对HFile格式的了解,可以发现HFile中有一个segment叫做block index segment。这个segment包含了HFile中所有block中第一行的key(不过这里的key包含了更多的信息:row/fam:qualifier。。。)。默认的block大小是64K,默认的region大小是256M,所以通读取block index segment我们可以比较容易地、直接地获取大概256M/64K=4096个key。当然,这些key是排好序的,所以我们可以进一步对这4千个key进行等间隔采样,从而获得采样key。


第2)种方法,hive是一个非常强大的数据分析工具,它提供了Hql,可以用类似于sql的语句对数据进行分析。hbase-handle则是hive和hbase的桥梁,使得hive可以读取/写入HBase,并在Mapreduce框架下处理HBase的数据。
1 楼 lc_koven 2011-12-14  
很有道理,直接读取blockindex