2012-10-13 27 views
3

问题执行HBase的查询优化中的MapReduce

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

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

问题

  1. MR作业执行即席查询的表b & C.例如,地图任务1进行查询,以获得用户1安打,地图任务2执行查询来获取命中为用户2。如果这些命中在同一个区域服务器中结束,是否会妨碍性能(比赛条件等)?是否有像ChainMapper(ChainReducer)这样的模式来分割输入集,以便每个映射器都具有跨越一个区域服务器的键?
  2. 我最初的想法是让队列包含所有必需的输入(来自b和c的结果)。这个输入将被压缩(只有建模需要)。这种方法将避免在同一时间内通过多个地图任务执行特别查询(跨地区服务器)。

欢迎任何其他建议。

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

回答

1

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

构建布隆过滤器和集B

Map: A -> BF(A), S = {regions of B} 

使用自定义InpufFormat的受影响的地区,这将使用受影响的地区为B-表扫描,并扫描整个表一

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

做你的分析中减少工作。

+0

是的分析工作减少。 – satish