2014-02-11 63 views
0

我在hbase中有一个足够大的数据集,它需要几个小时才能在整个数据集上运行mapreduce作业。我希望能够打破使用预先计算的指标数据:每天一次映射整个数据集,并把它分解成多个索引:所有用户的以百万次扫描运行hbase mapreduce作业有意义吗?

  • 1%的样品
  • 所有用户谁正在参加特定的A/B实验
  • 夜间预售频道上的所有用户。
  • 与paticular插件(或任何标准,我们有兴趣在这一周)

我的想法是只存储行ID列表相关的记录,再后来人能做到的一点,所有用户在这些行上映射减少作业。但是1%的样本仍然是1M行数据,我不确定如何在一百万行列表上构建mapreduce作业。

如果将有一百万个不同的Scan对象组成查询,那么使用initTableMapperJob(List scan)创建一个表映射器作业是否有意义?还有其他方法可以做到这一点,以便我仍然可以有效地将计算和I/O消除到hbase群集?

回答

1

不要做万次扫描。如果您有一百万个非连续的ID,您可以使用自定义输入格式在ID列表上运行map/reduce作业,以便将列表划分为合理数量的分区(我猜可能是您的数量的4倍m/r插槽,但该数字并不基于任何内容)。这会给你一百万次获得操作,这可能比一百万次扫描更好。

如果你足够幸运,有连续范围的更合理一些,那么扫描会比直接获取

+0

大卫,这是很好的建议,我有如下问题: 我认为的一个hbase mapreduce的好处是地图作业可以在数据存储在hbase/hadoop中的相同节点上运行。这是真的?有没有一种方法来分割我的输入,以便这仍然是真实的,并尽量减少跨节点I/O? – bsmedberg

+0

当然。它比具有TableInputFormat的标准M/R作业更简单,因为您将不得不以自定义输入格式自行设置节点关联。好消息是TableInputFormat是开源的,你应该能够从那里窃取大部分逻辑 – David