【问题标题】:Hive 0.13 bucketed map joinHive 0.13 分桶地图连接
【发布时间】:2015-08-01 00:44:56
【问题描述】:

历史上是否有人在 Hive 13 中成功执行了桶式地图连接?关于 BMJ 的文档有限(http://www.openkb.info/2014/11/understanding-hive-joins-in-explain.html#.VVuZZpNVikohttps://cwiki.apache.org/confluence/download/attachments/27362054/Hive%2BSummit%2B2011-join.pdf)。它们看起来很棒,但我无法让它们工作。

如果我理解正确,我必须使用以下参数开始我的命令:

SET hive.optimize.bucketmapjoin=true;

这将导致 Hive 自动将我的懒惰、超慢、常规的旧 reducer 连接转换为轻巧(甚至苗条?)、快速完成、分桶的 map 连接。也许我在这里遗漏了一些参数?

我的表都正确存储。它们都被分到 1024 个桶中(这可能太多了吗?)。小表的桶大小约为 15MB,大表的桶平均大小约为 10GB。

这是我的命令的样子:

SET hive.optimize.bucketmapjoin=true;

SELECT
   EV.advertiser_id,
   EV.pixel_id,
   RDB.segment_id
FROM 
   rakuten_segment_index2_bucketed_event_logs_ddp EV
   JOIN rakuten_sir_bucketed_rdb RDB
      ON EV.mm_uuid = RDB.mm_uuid
WHERE 
   EV.days = 90 AND RDB.days = 90;

此命令导致减速器连接缓慢而稳定。它运行良好,但速度很慢。

需要注意的一点是这些表是分区的。我只对加入分区值(天)= 90 的这些表感兴趣。这些表被分区的事实是否会破坏分桶映射连接?

我还尝试使用/*+MAPJOIN(EV)*/ 显式设置地图连接提示。 这会强制使用普通的 mapjoin,而不是 bucketed mapjoin。 Hive 尝试将整个 small(er) table 加载到 hashmap 中,并且很快就会耗尽内存。

【问题讨论】:

    标签: join dictionary hive bucket


    【解决方案1】:

    我最终能够让它工作。似乎和hive.mapjoin.bucket.cache.size有关。

    尝试将此设置为比默认值更高的数字(我认为是 10 或 100)。我的工作运行良好,如下所示:

    SET hive.optimize.bucketmapjoin=true;
    set hive.exec.reducers.max = 30000;
    set hive.mapjoin.bucket.cache.size=100000000;
    
    SELECT /*+MAPJOIN(EV)*/
       EV.advertiser_id,
       EV.pixel_id,
       RDB.segment_id
    FROM 
       tbl_a EV
       JOIN tbl_b RDB
          ON EV.mm_uuid = RDB.mm_uuid
    WHERE 
       EV.days = 90 AND RDB.days = 90;
    

    注意:mapjoin 提示也是必需的。

    【讨论】:

    • >> 什么都不感谢 .. 不客气.. 我正要投票赞成你的问题和答案.. 但现在我三思而后行。
    • 好的,我看到您删除了该声明。我现在正在投票 - 你的问答质量都很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多