Hive优化:Explain执行计划应该怎么看?

56 篇文章 11 订阅
55 篇文章 1 订阅

Hive优化:Explain执行计划

一:Explain执行计划

想要做好hive优化,你可以启用一些hive配置,压缩文件等等,但是羊毛出在羊身上,硬件配置好了,写了一个无敌菜sql,任凭你的配置再好,也不能顶得住sql的毁灭打击啊

所以就要了解一下sql的执行计划了,所谓sql执行计划,就是描绘出了这段sql的运行情况,有多少mr,有几个阶段,每个阶段干了什么,怎么join的,怎么分组的,怎么排序的,等等,根据这些执行计划,让你可以检索出bad代码,做出好的优化

二:Explain的语法

我们可以使用Explain查看sql的执行计划,使用方法

explain query;

直接explain后跟上你的sql语句即可

三:Explain的用法

出来了结果我们肯定要会看呢,比如执行下面一行简单的sql

select 
  t1.*
  ,t2.* 
from t1 
join t2 
on t1.name=t2.name;

很简单的一个sql,只涉及了一个join,那么看一下他的执行计划

explain select t1.*,t2.* from t1 join t2 on t1.name=t2.name;

结果:

Explain
STAGE DEPENDENCIES:
  Stage-2 is a root stage
  Stage-1 depends on stages: Stage-2
  Stage-0 depends on stages: Stage-1

STAGE PLANS:
  Stage: Stage-2
    Spark
      DagName: lnnu_20220323190211_98dbabe0-52c5-42d1-b54c-431e36f7ee82:5
      Vertices:
        Map 2 
            Map Operator Tree:
                TableScan
                  alias: t2
                  Statistics: Num rows: 3 Data size: 21 Basic stats: COMPLETE Column stats: NONE
                  Filter Operator
                    predicate: name is not null (type: boolean)
                    Statistics: Num rows: 3 Data size: 21 Basic stats: COMPLETE Column stats: NONE
                    Select Operator
                      expressions: name (type: string), age (type: int)
                      outputColumnNames: _col0, _col1
                      Statistics: Num rows: 3 Data size: 21 Basic stats: COMPLETE Column stats: NONE
                      Spark HashTable Sink Operator
                        keys:
                          0 _col0 (type: string)
                          1 _col0 (type: string)
            Execution mode: vectorized
            Local Work:
              Map Reduce Local Work

  Stage: Stage-1
    Spark
      DagName: lnnu_20220323190211_98dbabe0-52c5-42d1-b54c-431e36f7ee82:4
      Vertices:
        Map 1 
            Map Operator Tree:
                TableScan
                  alias: t1
                  Statistics: Num rows: 3 Data size: 21 Basic stats: COMPLETE Column stats: NONE
                  Filter Operator
                    predicate: name is not null (type: boolean)
                    Statistics: Num rows: 3 Data size: 21 Basic stats: COMPLETE Column stats: NONE
                    Select Operator
                      expressions: name (type: string), age (type: int)
                      outputColumnNames: _col0, _col1
                      Statistics: Num rows: 3 Data size: 21 Basic stats: COMPLETE Column stats: NONE
                      Map Join Operator
                        condition map:
                             Inner Join 0 to 1
                        keys:
                          0 _col0 (type: string)
                          1 _col0 (type: string)
                        outputColumnNames: _col0, _col1, _col2, _col3
                        input vertices:
                          1 Map 2
                        Statistics: Num rows: 3 Data size: 23 Basic stats: COMPLETE Column stats: NONE
                        File Output Operator
                          compressed: false
                          Statistics: Num rows: 3 Data size: 23 Basic stats: COMPLETE Column stats: NONE
                          table:
                              input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                              output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
                              serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
            Execution mode: vectorized
            Local Work:
              Map Reduce Local Work

  Stage: Stage-0
    Fetch Operator
      limit: -1
      Processor Tree:
        ListSink

看到上面的内容蒙圈吗?别担心,一行行看

首先

Explain
STAGE DEPENDENCIES:
  Stage-2 is a root stage
  Stage-1 depends on stages: Stage-2
  Stage-0 depends on stages: Stage-1

这个说明了有三个阶段,stage-2是开始的节点,stage-1依赖于stage-2,stage-0依赖于stage-1

往下:

STAGE PLANS:
  Stage: Stage-2
    Spark
      DagName: lnnu_20220323190211_98dbabe0-52c5-42d1-b54c-431e36f7ee82:5
      Vertices:
        Map 2 
            Map Operator Tree:
                TableScan
                  alias: t2
                  Statistics: Num rows: 3 Data size: 21 Basic stats: COMPLETE Column stats: NONE
                  Filter Operator
                    predicate: name is not null (type: boolean)
                    Statistics: Num rows: 3 Data size: 21 Basic stats: COMPLETE Column stats: NONE
                    Select Operator
                      expressions: name (type: string), age (type: int)
                      outputColumnNames: _col0, _col1
                      Statistics: Num rows: 3 Data size: 21 Basic stats: COMPLETE Column stats: NONE
                      Spark HashTable Sink Operator
                        keys:
                          0 _col0 (type: string)
                          1 _col0 (type: string)
            Execution mode: vectorized
            Local Work:
              Map Reduce Local Work

因为这里的hive引擎我改成了spark,如果引擎是mr,那么就会显示map和reduce

以下是对参数的一些说明,来源于https://mp.weixin.qq.com/s/3483ib06DFQfhLFOZAv_jA,详细的可以参考

  1. TableScan:表扫描操作,map端第一个操作肯定是加载表,所以就是表扫描操作,常见的属性:

    • alias:表名称
    • Statistics:表统计信息,包含表中数据条数,数据大小等
  2. Select Operator:选取操作,常见的属性 :

    • expressions:需要的字段名称及字段类型
    • outputColumnNames:输出的列名称
    • Statistics:表统计信息,包含表中数据条数,数据大小等
  3. Group By Operator:分组聚合操作,常见的属性:

    • aggregations:显示聚合函数信息
    • mode:聚合模式,值有 hash:随机聚合,就是hash partition;partial:局部聚合;final:最终聚合
    • keys:分组的字段,如果没有分组,则没有此字段
    • outputColumnNames:聚合之后输出列名
    • Statistics:表统计信息,包含分组聚合之后的数据条数,数据大小等
  4. Reduce Output Operator:输出到reduce操作,常见属性:

    • sort order:值为空 不排序;值为 + 正序排序,值为 - 倒序排序;值为 ± 排序的列为两列,第一列为正序,第二列为倒序
  5. Filter Operator:过滤操作,常见的属性:

    • predicate:过滤条件,如sql语句中的where id>=1,则此处显示(id >= 1)
  6. Map Join Operator:join 操作,常见的属性:

    • condition map:join方式 ,如Inner Join 0 to 1 Left Outer Join0 to 2
    • keys: join 的条件字段
    • outputColumnNames:join 完成之后输出的字段
    • Statistics:join 完成之后生成的数据条数,大小等
  7. File Output Operator:文件输出操作,常见的属性

    • compressed:是否压缩
    • table:表的信息,包含输入输出文件格式化方式,序列化方式等
  8. Fetch Operator 客户端获取数据操作,常见的属性:

    • limit,值为 -1 表示不限制条数,其他值为限制的条数

四、图示Explain执行计划

最后我用图标注了每行的意思,可以作为参考
在这里插入图片描述

在这里插入图片描述

  • 6
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牧码文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值