3

问题

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

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

问题

  1. MR 作业正在对表 B 和 C 执行即席查询。例如,Map 任务 1 执行查询以获取用户 1 的命中,而 Map 任务 2 执行查询以获取用户 2 的命中。如果这些命中最终在同一区域服务器中,将它会妨碍性能(比赛条件等)吗?是否有像 ChainMapper (ChainReducer) 这样的模式来拆分输入集,以便每个映射器具有跨越一个区域服务器的键?
  2. 我最初的想法是让队列包含所有必需的输入(来自 b 和 c 的结果)。此输入将被压缩(仅用于建模)。这种方法将避免执行即席查询(同时通过多个地图任务跨区域服务器)。

欢迎任何其他建议。

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

4

1 回答 1

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 中做你的分析工作。

于 2012-10-14T19:57:06.450 回答