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

Hadoop 在MapReduce中以最佳方式执行HBase查询,hadoop,mapreduce,hbase,cloudera,Hadoop,Mapreduce,Hbase,Cloudera,问题 我们有多个HBase表:A、B、C。假设A是需要处理的记录队列。它可能包含平均2500万条记录。A有用户ID。B有每个用户执行的网站点击。B可以包含数十亿行。C有一些关于用户的辅助信息 我们使用MapReduce作业对队列中的记录执行预测分析(成千上万的决策树)。问题的范围不包括实际的分析建模 问题: MR job正在对表B和C执行特殊查询。例如,映射任务1执行查询以获取用户1的点击,映射任务2执行查询以获取用户2的点击。如果这些命中结果出现在同一个区域服务器上,是否会影响性能(竞赛条件等

问题

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

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

问题:

  • MR job正在对表B和C执行特殊查询。例如,映射任务1执行查询以获取用户1的点击,映射任务2执行查询以获取用户2的点击。如果这些命中结果出现在同一个区域服务器上,是否会影响性能(竞赛条件等)?是否有像ChainMapper(ChainReducer)这样的模式来拆分输入集,以便每个映射器都有跨越一个区域服务器的键
  • 我最初的想法是让队列包含所有必需的输入(来自b和c的结果)。该输入将被压缩(仅建模需要)。这种方法可以避免执行临时查询(通过同时执行多个映射任务跨区域服务器) 欢迎提出任何其他建议


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

    这不是很容易解决的问题,但我可以建议使用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中进行分析工作