Hive sql的一段执行计划

STAGE DEPENDENCIES:
Stage-1 is a root stage
Stage-6 depends on stages: Stage-1, Stage-3 , consists of Stage-7, Stage-8, Stage-2
Stage-7 has a backup stage: Stage-2
Stage-4 depends on stages: Stage-7
Stage-8 has a backup stage: Stage-2
Stage-5 depends on stages: Stage-8
Stage-2
Stage-3 is a root stage
Stage-0 depends on stages: Stage-4, Stage-5, Stage-2

一个stage对应一个mapreduce的作业
is a root stage 表示不依赖任何的stage,多个root stage的sql可以开启并行执行
depends on stages 表示依赖的stages必须执行完成之后才能执行
consists of Stage-7, Stage-8, Stage-2 表示的是其中一个stage满足即可。
Stage-7 has a backup stage: Stage-2 表示优先执行stage-7,如果stage-7不满足执行的要求,将会执行stage-2。比如map join的情况,如果小表的大小小于hive.mapjoin.smalltable.filesize小表阈值, 默认为25M,单位byte。就会执行stage-7,如果小表的大小大于小表阈值,将会执行stage-2的mapreduce。结果一样,但是性能会差很多。

join的一些调优参数
--是否自动转换为mapjoin,发生map join可以看到执行的stage对应的执行计划是map local task。而不是mapreduce。map join是将小表加载到内存,然后序列化到磁盘放到hdfs,然后放到所有的节点进行join
set hive.auto.convert.join = true;
--小表的最大文件大小,默认为25000000,即25M
set hive.mapjoin.smalltable.filesize = 25000000;
--是否将多个mapjoin合并为一个,针对的是连续多个join。多个join的小表都满足map join的时候可以合并,通过阈值判断合并哪几个还是全部map join合并。
set hive.auto.convert.join.noconditionaltask = true;
--多个mapjoin转换为1个时,所有小表的文件大小总和的最大值。如果有两个的和小于阈值,就合并两个,灵活合并map jion
set hive.auto.convert.join.noconditionaltask.size = 10000000;

问题:
20210310遇到的数据倾斜问题,3个left join耗时1小时, 事实表数据量70G。
搜索点击数据事实表(数据量比较大)join 搜索关键字的分词维度表 using 搜索关键字
使用搜索关键字当做key在map-reduce进行hash分区,热门的搜索词搜索的记录比较多,这样就会导致数据倾斜。

处理方式

  1. 先统计搜索点击事实表中的搜索词有没有为null和''的,统计数量,避免空值导致的数据倾斜。
    结果:没有空值的搜索词
  2. 判断join的分词维度表是不是小表,查看后发现大小为140M,设置hive.mapjoin.smalltable.filesize大于140M,
    结果:执行任务,查看stage的执行情况,发现执行了map local task。而不是mapreduce任务。(查看方法:对比日志中执行的stage和执行计划中的stage就能发现执行的是map local task,而不是mapreduce)。3个left join的sql耗时缩短为30分钟。

继续优化
将多个map join进行合并(也就是将3个left join的map join进行合并)。待补充。

posted on 2021-03-10 22:41  jeasonchen001  阅读(781)  评论(0编辑  收藏  举报