多个扫描对象上的HBase Mapreduce

时间:2011-01-27 20:26:25

标签: mapreduce hbase

我正在尝试评估HBase我们正在做的一些数据分析。

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

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

public static void initTableMapperJob(String table,                                       扫描扫描,                                       类映射器,                                       类outputKeyClass,                                       类outputValueClass,                                       org.apache.hadoop.mapreduce.Job job)                                抛出IOException

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

由于

3 个答案:

答案 0 :(得分:9)

TableMapReduceUtil.initTableMapperJob将您的工作配置为使用TableInputFormat,正如您所说,Scan只需InputFormat

听起来您想要扫描表格的多个片段。为此,您必须创建自己的MultiSegmentTableInputFormat,例如TableInputFormatBase。扩展getSplits并覆盖super.getSplits方法,以便为表的每个开始/停止行段调用TableInputFormatBase.scan.setStartRow()一次。 (最简单的方法是每次InputSplit)。将返回的MultiSegmentTableInputFormat实例聚合到单个列表中。

然后自行配置作业以使用自定义{{1}}。

答案 1 :(得分:0)

您正在寻找班级:

  

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

每次扫描都可以使用过滤器。过滤器可能非常复杂。 FilterList允许您指定多个单个过滤器,然后在所有组件过滤器之间执行AND或OR。您可以使用它在行上构建任意布尔查询。

答案 2 :(得分:0)

我尝试过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引用Dave L'评论中提到的MultiSegmentTableInputFormat。