Hive优化:Explain执行计划


内容目录

  • Hive优化:Explain执行计划
  • 一:Explain执行计划
  • 二:Explain的语法
  • 三:Explain的用法
  • 四、图示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


  1. TableScan:表扫描操作,map端第一个操作肯定是加载表,所以就是表扫描操作,常见的属性:
  • alias:表名称
  • Statistics:表统计信息,包含表中数据条数,数据大小等
  1. Select Operator:选取操作,常见的属性 :
  • expressions:需要的字段名称及字段类型
  • outputColumnNames:输出的列名称
  • Statistics:表统计信息,包含表中数据条数,数据大小等
  1. Group By Operator:分组聚合操作,常见的属性:
  • aggregations:显示聚合函数信息
  • mode:聚合模式,值有 hash:随机聚合,就是hash partition;partial:局部聚合;final:最终聚合
  • keys:分组的字段,如果没有分组,则没有此字段
  • outputColumnNames:聚合之后输出列名
  • Statistics:表统计信息,包含分组聚合之后的数据条数,数据大小等
  1. Reduce Output Operator:输出到reduce操作,常见属性:
  • sort order:值为空 不排序;值为 + 正序排序,值为 - 倒序排序;值为 ± 排序的列为两列,第一列为正序,第二列为倒序
  1. Filter Operator:过滤操作,常见的属性:
  • predicate:过滤条件,如sql语句中的where id>=1,则此处显示(id >= 1)
  1. Map Join Operator:join 操作,常见的属性:
  • condition map:join方式 ,如Inner Join 0 to 1 Left Outer Join0 to 2
  • keys: join 的条件字段
  • outputColumnNames:join 完成之后输出的字段
  • Statistics:join 完成之后生成的数据条数,大小等
  1. File Output Operator:文件输出操作,常见的属性
  • compressed:是否压缩
  • table:表的信息,包含输入输出文件格式化方式,序列化方式等
  1. Fetch Operator 客户端获取数据操作,常见的属性:
  • limit,值为 -1 表示不限制条数,其他值为限制的条数

四、图示Explain执行计划

最后我用图标注了每行的意思,可以作为参考

hive 查看逻辑计划 查看hive执行计划_执行计划

hive 查看逻辑计划 查看hive执行计划_hive 查看逻辑计划_02