工作中优化集合

●案例一分享:最近优化一个case,类似于:insert overwrite table target_table (dayno=20211220) select a,count(1) from source_table where dayno beetween 20201219 and 20211219 group by a; 这个sql每天都要回溯一年的数据,在时间和费用上耗时都很高,尤其是晚上任务高峰期,等待资源的时间有时候会很长,拉长了任务的执行时间。
●解决办法:1. 可以先将中间部分数据聚合:insert overwrite table target_table_tmp select a,count(1) from source_table where dayno beetween 20210119 and 20211118;
2. 再将sql改成前部时间、临时表、后部时间的方式聚合的形式:
insert overwrite table target_table (dayno=20211219)
select a,cnt
from(
select a,count(1) as cnt from
source_table where dayno beetween 20201219 and 20210118
group by a
union all
select a,count(1) as cnt from
target_table_tmp
group by a
union all
select a,count(1) as cnt from
source_table where dayno beetween 20211119 and 20211219
group by a
)tmp
3. 按月更新 target_table_tmp 表。
这样每天的任务耗时和花费都会下降很多。

●案例二分享:最近遇到一个case是: insert overwrite table target_table partition(dayno=‘20211217’,hour=‘6’,sys) select other_data,sys from source_table; 这个sql,spark计算部分10分钟就跑完了,但是在将计算好的临时文件rename到正式分区下面时,花费了将近30分钟,最终导致整个任务耗时40分钟。
●原因:目标表分区超过60W+,动态三级分区插入目标表,每插入一个三级分区都会路由回一级分区对每个分区目录添加权限。拖慢了整体的执行效率。
●解决办法:启动sparksql任务时添加参数:–hiveconf spark.hadoop.hive.warehouse.subdir.inherit.perms=false
参数意义:对写入表下面所有文件进行赋予相同权限(和表相同权限)的操作。
由于我们的系统权限认证是基于神盾的,实际上并不需要这一操作,因此可以关闭。添加参数后,该任务就只用10分钟就完成了。

●案例分享:最近遇到一个用户往动态分区表插入数据时报错的问题,报错内容:Dynamic partition strict mode requires at least one static partition column. To turn this off set hive.exec.dynamic.partition.mode=nonstrict。
●解决办法:
sql模式 添加参数 set livy.session.conf.spark.hadoop.hive.exec.dynamic.partition.mode=nonstrict;
脚本模式 添加参数 --hiveconf livy.session.conf.spark.hadoop.hive.exec.dynamic.partition.mode=nonstrict;
●严格模式下的好处
严格模式(strict mode)下,在动态分区表中插入分区数据需要提前在动态分区表中建立一个静态分区,而非严格模式(nonstrict)则不需要。这是为了防止用户在短时间内创建大量的新的分区(用户原意可能是只在子分区内进行动态建分区,但是由于疏忽忘记为主分区列指定值了),而对系统性能造成影响。因此,动态分区关闭严格模式也会带来一定风险,用户使用时需注意。除特殊操作外,一般默认使用严格模式。
●验证数据倾斜的方式:大数据计算场景中,我们经常遇到一个问题–数据倾斜,一旦出现了数据倾斜,很容易导致executor oom,任务失败。那么如何定位是否发生了数据倾斜呢?
数据倾斜发生时的现象:绝大多数task执行得都非常快,但个别task执行极慢。比如,总共有1000个task,997个task都在1分钟之内执行完了,但是剩余两三个task却要一两个小时。
举例:
原代码:CREATE TABLE tmp AS SELECT * FROM a JOIN b ON a.key=b.key;
验证左表是否倾斜:select key ,count(1) from A group by key order by count(1) desc limit 10;
验证右表是否倾斜:select key ,count(1) from B group by key order by count(1) desc limit 10;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值