HBase Mapreduce在多个扫描对象上

HBase Mapreduce在多个扫描对象上

问题描述:

我只是试图评估一些我们正在做的数据分析工作的HBase。HBase Mapreduce在多个扫描对象上

HBase将包含我们的事件数据。关键将是eventId +时间。我们希望在日期范围内对少数事件类型(4-5)进行分析。事件类型的总数大约为1000.

在hbase表上运行mapreduce作业的问题是initTableMapperJob(请参阅下文)只接受1个扫描对象。出于性能原因,我们希望在给定日期范围内仅扫描4-5个事件类型的数据,而不是1000个事件类型。如果我们使用下面的方法,那么我想我们没有这个选择,因为它只需要1个扫描对象。

公共静态无效initTableMapperJob(字符串表, 扫描扫描, 类映射, 类outputKeyClass, 类outputValueClass, org.apache.hadoop.mapreduce.Job工作) 抛出IOException异常

是否有可能在扫描对象列表上运行mapreduce?任何解决方法?

感谢

TableMapReduceUtil.initTableMapperJob将您的工作配置为使用TableInputFormat,正如您所记下的那样,该工具只需一个Scan

这听起来像你想扫描表的多个部分。为此,您必须创建自己的InputFormat,类似MultiSegmentTableInputFormat。扩展TableInputFormatBase并覆盖getSplits方法,以便它为表的每个开始/停止行段调用super.getSplits一次。 (最简单的方法是每次到TableInputFormatBase.scan.setStartRow())。汇总InputSplit实例返回到单个列表。

然后自己配置作业以使用您的自定义MultiSegmentTableInputFormat

您正在寻找类:

组织/阿帕奇/的Hadoop/HBase的/过滤/ FilterList.java

每次扫描可采取过滤器。过滤器可能相当复杂。 FilterList允许您指定多个单一过滤器,然后在所有组件过滤器之间执行AND或OR。你可以使用这个来在行上建立一个任意的布尔查询。

+2

这种方法存在的问题是HBase必须在过滤之前至少从磁盘读取这些值。如果您拥有数十亿行,性能会很慢。 – StackUnderflow 2011-01-28 23:31:57

+0

由于StackUnderflow提到的问题而不得不downvote。对于数十亿行,做一个过滤器非常缓慢。 – Gattster 2013-03-26 00:28:03

我试过Dave L的方法,它的工作很漂亮。

要配置图的工作,你可以使用函数

TableMapReduceUtil.initTableMapperJob(byte[] table, Scan scan, 
    Class<? extends TableMapper> mapper, 
    Class<? extends WritableComparable> outputKeyClass, 
    Class<? extends Writable> outputValueClass, Job job, 
    boolean addDependencyJars, Class<? extends InputFormat> inputFormatClass) 

其中inputFormatClass指MultiSegmentTableInputFormat戴夫L的评论中提到。