hive开启自动转化common join和map join 带来的问题

背景:

我们采用的hive版本是3.1.2属于较新版本,此版本下hive本身默认开启map join

相关配置

hive默认开启map join,涉及的配置如下:

hive.auto.convert.join=true

错误分析

错误发生在我们使用曝光转化明细宽表和素材维表进行join时,由于两个表都非常大,我们本意是让他进行common join即可,但是在运行程序时出现了报错:

Error while processing statement: FAILED: Execution Error, return code 3 from org.apache.hadoop.hive.ql.exec.mr.MapredLocalTask

在这里插入图片描述
我们发现任务一直在加载hashtable,最终内存不足从而导致报错。

map join原理

MapJoin是指在Map 端进行join,其原理是broadcast join,即把小表作为一个完整的驱动表来进行join操作。通常情况下,要连接的各个表里面的数据会分布在不同的Map中进行处理。即同一个Key对应的Value可能存在不同的Map中。这样就必须等到 Reduce中去连接。要使MapJoin能够顺利进行,那就必须满足这样的条件:除了一份表的数据分布在不同的Map中外,其他连接的表的数据必须在每个Map中有完整的拷贝。Map Join会把小表全部读入内存中,在Map阶段直接拿另外一个表的数据和内存中表数据做匹配 (这时可以使用Distributed Cache将小表分发到各个节点上,以供Mapper加载使用),由于在map时进行了join操作,省去了reduce运行的效率也会高很多。详见笔者之前文章hive sql数据倾斜——大表join小表如何使用map join

当机器内存不足时,无法在Map端进行join,即会报错。

解决办法:

仅供参考

方法一:关闭hive配置,手动开启mapjoin

  • 在hive-site.xml配置,配置完即可生效
<property>
         <name>hive.auto.convert.join</name>
         <value>false</value>//true修改为false
         <description>Enables the optimization about converting common join into mapjoin</description>
</property>

方法二:针对任务在调度时选择是否开启join,同时对多阶段进行手动控制

  • 使用hive --hiveconf 配置参数为false
hive.auto.convert.join=false
  • 具体代码具体分析即可

解决后效果

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Hive中使用MAPJOIN,通常用于一个小表和一个大表进行JOIN的场景。具体来说,MAPJOIN会将小表的全部数据加载到内存中,在map阶段直接与另一个表的数据进行匹配,从而省去了reduce运行的时间,是一种优化的方法。在Hive0.7之前,需要使用hint提示/*+mapjoin(table)*/才会执行MapJoin,否则执行普通的JOIN操作。但是在0.7版本之后,默认会自动转换为MapJoin,可以通过hive.auto.convert.join参数来控制,默认为true。使用MapJoin时,map阶段不会进行排序操作,而是直接匹配数据进行JOIN。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [hiveCommon JoinMap Join的机制(例子详解)](https://blog.csdn.net/dingchangxiu11/article/details/103701026)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [mapjoin的使用方法以及注意事项](https://blog.csdn.net/zixoa/article/details/108508959)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扫地增

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值