【问题标题】:HBase Mapreduce on multiple scan objects多个扫描对象上的 HBase Mapreduce
【发布时间】:2011-06-16 19:50:28
【问题描述】:

我只是想针对我们正在做的一些数据分析工作评估 HBase。

HBase 将包含我们的事件数据。关键是 eventId + time。我们希望在一个日期范围内对少数事件类型 (4-5) 进行分析。事件类型总数在1000左右。

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

public static void initTableMapperJob(String table, 扫描扫描, 类映射器, 类输出KeyClass, 类输出值类, org.apache.hadoop.mapreduce.Job 作业) 抛出 IOException

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

谢谢

【问题讨论】:

    标签: mapreduce hbase


    【解决方案1】:

    TableMapReduceUtil.initTableMapperJob 将您的作业配置为使用 TableInputFormat,正如您所注意到的,它需要一个 Scan

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

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

    【讨论】:

    【解决方案2】:

    您正在寻找课程:

    org/apache/hadoop/hbase/filter/FilterList.java

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

    【讨论】:

    • 这种方法的问题是 HBase 在过滤之前必须至少从磁盘读取这些值。如果有数十亿行,性能会很慢。
    • 由于 StackUnderflow 提到的问题而不得不投反对票。对于数十亿行,执行过滤器非常慢。
    【解决方案3】:

    我尝试了 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 的 cmets 中提到的 MultiSegmentTableInputFormat。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 2016-12-28
      相关资源
      最近更新 更多