spark1.6.3执行hivesql遇到left join 时报can't zip rdds

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spark1.6.3执行hivesql遇到left join 时报can't zip rdds相关的知识,希望对你有一定的参考价值。

参考技术A 在spark 上跑hive sql 脚本,在spark 2.x以上跑没问题 ,hive上没问题,spark1.6上跑最后会报如图以上问题 ,墙内比较难找到对应解决办法 ,可以在脚本里配置一下配置,spark.sql.adaptive.enabled=true,默认值是false。设置为true的话,就是开启了Spark SQL自适应查询引擎,就是在运行时,通过一些统计指标来动态优化Spark sql的执行计划。

产生原因目前没有找到合适的解释,产生问题的地方很简单,就是两个表在left join 预估是因为数据倾斜导致 ,a left join b的时候 ,b表数据较小,大量数据关联不上,导致数据倾斜

Etl之HiveSql调优(left join where的位置)

一、前言

公司实用Hadoop构建数据仓库,期间不可避免的实用HiveSql,在Etl过程中,速度成了避无可避的问题。本人有过几个数据表关联跑1个小时的经历,你可能觉得无所谓,可是多次Etl就要多个小时,非常浪费时间,所以HiveSql优化不可避免。

注:本文只是从sql层面介绍一下日常需要注意的点,不涉及Hadoop、MapReduce等层面,关于Hive的编译过程,请参考文章:http://tech.meituan.com/hive-sql-to-mapreduce.html

二、准备数据

假设咱们有两张数据表。

景区表:sight,12W条记录,数据表结构:

技术分享图片
hive> desc sight;
OK
area                    string                  None                
city                    string                  None                
country                 string                  None                
county                  string                  None                
id                      string                  None                
name                    string                  None                
region                  string                  None     
技术分享图片

景区订单明细表:order_sight,1040W条记录,数据表结构:

技术分享图片
hive> desc order_sight;    
OK
create_time             string                  None                
id                      string                  None                
order_id                string                  None                
sight_id                bigint                  None  
技术分享图片

 三、分析

3.1 where条件

那么咱们希望看见景区id是9718,日期是2015-10-10的所有订单id,那么sql需要如下书写:

select s.id,o.order_id from sight s left join order_sight o on o.sight_id=s.id where s.id=9718 and o.create_time = 2015-10-10; 
需要的时间是52秒,如果咱们换一个sql的书写方式:

select s.id,o.order_id from sight s left join (select order_id,sight_id from order_sight where create_time = ‘2015-10-10‘) o on o.sight_id=s.id where s.id=9718

实用43秒,快了一些。当然咱们并不是仅仅分析说快了20%(我还多次测试,这次的差距最小),而是分析原因!

单从两个sql的写法上看的出来,特别是第二条的红色部分,我将left的条件写到里面了。那么执行的结果随之不一样,第二条的Reduce时间明显小于第一条的Reduce时间。

 

原因是这两个sql都分解成8个Map任务和1个Reduce任务,如果left的条件写在后面,那么这些关联操作会放在Reduce阶段,1个Reduce操作的时间必然大于8个Map的执行时间,造成执行时间超长。

结论:当使用外关联时,如果将副表的过滤条件写在Where后面,那么就会先全表关联,之后再过滤




以上是关于spark1.6.3执行hivesql遇到left join 时报can't zip rdds的主要内容,如果未能解决你的问题,请参考以下文章

HiveSql&SparkSql —— 使用left semi join做inexists类型子查询优化

Spark ALS recommendForAll源码解析实战之Spark1.x vs Spark2.x

Spark ALS recommendForAll源码解析实战之Spark1.x vs Spark2.x

万字长文详解HiveSQL执行计划

万字长文详解HiveSQL执行计划

万字长文详解HiveSQL执行计划