Hive on Tez 出现的bug 及原因解析

Posted yangxusun9

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive on Tez 出现的bug 及原因解析相关的知识,希望对你有一定的参考价值。

现象描述

在使用Tez引擎查询时,发现一个bug:

  

SELECT
         t1.*,t2.activity_id,t3.timeMap
     from
         (select * from ods_order_info where dt=2020-03-29) t1  --单独查询结果为7条
             left join
         (select order_id,activity_id  from ods_activity_order where dt=2020-03-29) t2  --t1 与t2 left join ,结果为7条
         on t1.id=t2.order_id
             join
         (select order_id,str_to_map(concat_ws(,,collect_set(concat(order_status,=,operate_time))),,,=) timeMap
          from ods_order_status_log where dt=2020-03-29
          group by order_id) t3  --单独查询是跟t1主键相同的7条
         on t3.order_id=t1.id

讲道理此SQL查询出的结果应该是7条,但是结果确是4条  

  技术图片

 

 而利用MR引擎查询出来的结果是正确的7条

set hive.execution.engine=mr;

技术图片

 

 原因分析

这是因为Tez和MR一样,都默认开启了mapjoin,这里面涉及到了几个参数

-- 是否自动开启mapjoin,默认为true
set hive.auto.convert.join=true;

-- mapjoin小表和大表的阈值设置
set hive.mapjoin.smalltable.filesize=25000000;

-- 多个mapjoin 转换为1个时,限制输入的最大的数据量 影响tez,默认10m
set hive.auto.convert.join.noconditionaltask.size =10000000;

当表的数据大于10m时,tez会把多余的那部分数据截掉,这样就会造成丢数据

解决方法

1.

hive.mapjoin.smalltable.filesize和hive.mapjoin.smalltable.filesize一致或者更大,一般扩大10倍是不会有问题的 保证小表中所有的数据,都可以参与计算。

2.

关闭map join 

以上是关于Hive on Tez 出现的bug 及原因解析的主要内容,如果未能解决你的问题,请参考以下文章

Hive on Tez

配置 Hive On Tez

hive on tez配置

记一发Hive on tez的配置(Hive 3.1.1, Hadoop 3.0.3, Tez 0.9.1)

hive on tez

hive on spark VS SparkSQL VS hive on tez