在MapReduce中以最佳方式执行HBase查询

时间:2012-10-13 20:16:05

标签: hadoop mapreduce hbase cloudera

问题

我们有多个HBase表:A,B,C。让我们假设,A是需要处理的记录队列。它可能包含平均2500万条记录。 A有用户ID。 B具有由每个用户执行的网站点击。 B可能包含数十亿行。 C有一些关于用户的辅助信息。

我们使用MapReduce作业对队列中的记录执行预测分析(成千上万个决策树)。问题的范围不包括实际的分析建模。

问题

  1. MR作业正在对表格B&amp ;;执行特殊查询。 C.例如,Map任务1执行查询以获取用户1的命中,Map任务2执行查询以获得用户2的命中。如果这些命中最终在同一区域服务器中,是否会妨碍性能(竞争条件等)?是否有类似ChainMapper(ChainReducer)的模式来分割输入集,以便每个映射器具有跨越一个区域服务器的键?
  2. 我最初的想法是让队列包含所有必需的输入(来自b和c的结果)。此输入将被压缩(仅建模所需的输入)。这种方法可以避免执行特殊查询(同时通过多个地图任务跨区域服务器)。
  3. 欢迎任何其他建议。

    我们正在使用cloudera CDH 3(hadoop,hbase)。

1 个答案:

答案 0 :(得分:1)

解决起来不是很容易,但我可以建议使用bloomfilter + reduce join。

构建bloomfilter和B

的受影响区域集
Map: A -> BF(A), S = {regions of B}

使用自定义InpufFormat,它将使用受影响的区域进行B表扫描,并扫描整个表A

Map: B U S -> (tag 'B', keyB => value)
     A -> (tag 'A', keyA => value)
Reduce: reduce-join

在Reduce中进行分析。