我只是想为我们正在做的一些数据分析工作评估一下HBase。
HBase将包含我们的事件数据。关键字是eventId + time。我们希望对日期范围内的几个事件类型(4-5)运行分析。事件类型总数约为1000个。
在hbase表上运行mapreduce作业的问题是initTableMapperJob (如下所示)只接受一个扫描对象。出于性能原因,我们只想扫描给定日期范围内4-5个事件类型的数据,而不是1000个事件类型。如果我们使用下面的方法,那么我猜我们没有这个选择,因为它只需要一个扫描对象。
公共静态无效initTableMapperJob(字符串表,扫描扫描,类映射器,类outputKeyClass,类outputValueClass,org.apache.hadoop.mapreduce.Job作业)抛出IOException
是否可以在扫描对象列表上运行mapreduce?有什么解决方法吗?
谢谢
发布于 2011-02-01 06:06:24
TableMapReduceUtil.initTableMapperJob
将您的作业配置为使用TableInputFormat
,正如您所提到的,它只占用一个Scan
。
这听起来像是想要扫描一个表的多个段。为此,您必须创建自己的InputFormat
,就像MultiSegmentTableInputFormat
一样。扩展TableInputFormatBase
并覆盖getSplits
方法,以便它为表的每个开始/停止行段调用一次super.getSplits
。(最简单的方法是每次都使用TableInputFormatBase.scan.setStartRow()
)。将返回的InputSplit
实例聚合到单个列表中。
然后自己配置作业以使用您的自定义MultiSegmentTableInputFormat
。
发布于 2011-01-29 01:56:20
您要查找的是类:
org/apache/hadoop/hbase/filter/FilterList.java
每次扫描都可以使用一个过滤器。过滤器可能非常复杂。FilterList允许您指定多个单个筛选器,然后在所有组件筛选器之间执行and或or。您可以使用它在行上构建任意布尔查询。
发布于 2013-04-02 03:59:19
我已经尝试了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。
https://stackoverflow.com/questions/4821455
复制相似问题