我正在尝试评估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?任何解决方法?
由于
答案 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。