hivesql小技巧

hivesql日志、执行计划怎么看/用

DAG图,看多少个stage,每个stage的执行内容,mr任务,执行顺序,过滤条件,是否有按预期做数据裁剪

如何判断长尾

通过执行日志,查看卡住的任务,记录数、数据量远大于其它的任务,且执行时间很长

如何找到长尾的key

1.对Key进行group by 统计records

2.执行过程中的长尾,可以通过分析日志定位

https://www.pianshen.com/article/57191653303/

3.定位长尾的key

打开长尾task日志--》搜索 “rows for joinkey”--》找到时间跨度最长的那条记录  对应的key就是热点的key值

定位造成倾斜的代码段

在长尾的执行日志搜索 “CommonJoinOperator: JOIN struct” ,找到join的key名字,然后结合执行计划,找到对应的key名字,从而定位到有数据倾斜的代码段

我一般会将嵌套执行的内部代码段执行一下看执行时间

也可以结合执行日志的job名看是哪一个阶段,这个阶段的执行内容在执行计划是可以看见的

数据倾斜优化

1.join 优化

1.1 空值用随机数打散

1.2 热点值单独处理,再与其它值 union all 

1.3 mapjoin

1.4 分桶,按桶join

1.5 map端聚合,hive.optmize.skewdata=true

1.6 调整reduce任务个数 mapred.reduce.tasks

2. group by数据倾斜优化

2.1 hive.map.aggr 启用map端的combiner

hive.groupby.skewindata  reduce任务前启动一个reduce任务,打散key

3.合并小文件

insert overwrite 避免insert 导致的小文件

避免数据上传导致的小文件,数据传输工具tunnel之类的,设置64mb才提交一次

HIVE编程的好习惯

1.过滤条件放到内层(谓词下推),分区裁剪、列裁剪

2. group by 替代 count(distinct),distributed by  sort by替代order by

3. 善用 union all 利用并行

4.小表(维表)前置,善用mapjoin

5. join的值类型相同

从业务上优化,避免不必要的计算

你可能感兴趣的:(hivesql小技巧)