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。你可以使用这个来在行上建立一个任意的布尔查询。
我试过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的评论中提到。
这种方法存在的问题是HBase必须在过滤之前至少从磁盘读取这些值。如果您拥有数十亿行,性能会很慢。 – StackUnderflow 2011-01-28 23:31:57
由于StackUnderflow提到的问题而不得不downvote。对于数十亿行,做一个过滤器非常缓慢。 – Gattster 2013-03-26 00:28:03