计算机系统应用教程网站

网站首页 > 技术文章 正文

HiveSQL执行计划解读-查看向量化描述信息

btikc 2024-10-12 10:57:15 技术文章 17 ℃ 0 评论

今天我们继续HiveSQL执行计划的学习。在学习之前我们先复习之前的知识:

回顾完,开始我们今天的学习-查看SQL的向量化描述信息。

查看SQL的向量化描述信息,我们可以使用explain vectorization这个命令。该命令是在Hive 2.3版本之后新增的功能,用于查看Map阶段或者Reduce阶段在运行过程中是否使用向量化模式。那什么是向量化模式?

向量化模式是Hive的一个特性,在没有引入向量化的执行模式之前,一般的查询操作一次只处理一行,在向量化查询执行时通过一次处理1024行的块来简化系统底层操作,提高了数据的处理性能。向量化模式的开启方式:

set hive.vectorized.execution.enabled = true;

explain vectorization支持的语法:explain vectorization [only | summary | operator | expression | detail]。接下来我们就来说明每个语法的使用。

explain vectorization only命令,表示整个执行计划将只显示向量化模式相关的描述信息,其它非向量化模式的描述都将被隐藏。看下面两个例子。

案例6.9 关闭向量模式的情况下,使用explain vectorization only

--关闭向量模式
set hive.vectorized.execution.enabled=false;
explain vectorization only
select count(1) from test;
输出结果:
PLAN VECTORIZATION:
  enabled: false //表示向量模式没有开启
  enabledConditionsNotMet: [hive.vectorized.execution.enabled IS false] //开启向量模式的条件不满足,因为hive.vectorized.execution.enabled IS false

上面案例,如果关闭向量化模式,在输出结果中可以看到PLAN VECTORIZATION一节,描述了该模式没有被开启,原因是由于没有满足enabledConditionsNotMet指代的条件。

案例6.10 开启向量模式的情况下,使用explain vectorization only

--开启向量模式
set hive.vectorized.execution.enabled=true;
explain vectorization only
select count(1) from test;
输出如下信息:
PLAN VECTORIZATION:
  enabled: true
  enabledConditionsMet: [hive.vectorized.execution.enabled IS true]
STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-0 depends on stages: Stage-1
STAGE PLANS:
  Stage: Stage-1
    Map Reduce
      Execution mode: vectorized
      Map Vectorization:
          enabled: true
          enabledConditionsMet: hive.vectorized.use.vector.serde.deserialize IS true
          groupByVectorOutput: true
          inputFileFormats: org.apache.hadoop.mapred.TextInputFormat
          allNative: false
          usesVectorUDFAdaptor: false
          vectorized: true
      Reduce Vectorization:
          enabled: false
          enableConditionsMet: hive.vectorized.execution.reduce.enabled IS true
          enableConditionsNotMet: hive.execution.engine mr IN [tez, spark] IS false

上面案例中,如果开启了向量化模式,除了有PLAN VECTORIZATION,还包含了STAGE DEPENDENCY和STAGE PLANS两部分的信息。我们在使用explain查看执行计划也看到了有这两部分信息,但是在本案例中不同的是,STAGE PLANS打印的不是Map和Reduce阶段的运行信息,而是两个阶段使用向量化模式的信息。接下来我们就对案例6.10出现的关键字进行解读:我们将Map和Reduce阶段的向量化模式描述信息简化成如下的结构进行解读:

  • l Execution Mode:表示当前的执行模式,vectorized当前模式是向量化的模式。
  • l Map Vectorization:表示接下来缩进描述段落描述的是Map阶段向量化模式信息。
  • l enabled: 表示该关键词所描述阶段是否已经开启向量化模式,true表示开启,false表示关闭。在案例6.10中我们可以显示看到Map Vectorization阶段是ture,Reduce Vectorizaition阶段是false。
  • l enabledConditionsMet:表示该关键词所描述阶段,开启向量化模式已经满足的条件。
  • l enableConditionsNotMet:表示该关键词所描述阶段,开启向量化模式未满足的条件。
  • l groupByVectorOutput:表示该关键词所描述的阶段,分组聚合操作是否开启向量化模式,true表示开启。
  • l inputFileFormats:表示该关键所描述的阶段,输入的文件格式。
  • l allNative:是否都是本地操作,false表示不是。

了解完主要的关键词,再看下案例6.10的输出结果,整个输出结果可以解读为在Map阶段开启了向量化的执行模式,但是在Reduce阶段没有开启(MapReduce计算引擎不支持)。在Map阶段开启向量化执行模式是因为满足hive.vectorized.use.vector. serde.deserialize IS true这个条件,Reduce阶段没有开启向量化执行模式,是因为除了需要满足hive.vectorized.execution.reduce.enabled IS true,还需要满足hive.execution.engine mr IN [tez, spark]这个条件。

使用explain vectorization summary命令会显示向量化的描述信息和Map/Reduce的执行过程的信息,即打印的信息等同于explain vectorization only和explain共同输出的结果。explain和explain vectorization only的打印信息都已介绍,这里就不在举例说明。

使用explain vectorization operator 命令会显示SQL所有操作的向量化描述信息。这是对explain vectorization only/summary的细化。

案例6.11 使用explain vectorization operator

--开启向量模式
set hive.vectorized.execution.enabled=true;
explain vectorization operator
select count(1) from test;
执行结果:
PLAN VECTORIZATION:
  enabled: true
  enabledConditionsMet: [hive.vectorized.execution.enabled IS true]
STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-0 depends on stages: Stage-1
STAGE PLANS:
  Stage: Stage-1
    Map Reduce
      Map Operator Tree:
          TableScan
            alias: test
       Statistics:…//统计信息
            TableScan Vectorization://表扫描的向量化描述信息
                native: true //读表操作采用本地的向量化表扫描操作
            Select Operator
              Select Vectorization: //列筛选的向量化描述信息
                  className: VectorSelectOperator
                  native: true //在列进行列筛选的时候也用到本地向量化操作
              Statistics: …//省略统计信息
              Group By Operator
                aggregations: count(1)
                Group By Vectorization: //分组聚合的向量化描述信息
                    className: VectorGroupByOperator
                    vectorOutput: true //在输出的时候用到分组聚合向量化操作
                    native: false
                mode: hash
                outputColumnNames: _col0
                Statistics: …//省略统计信息
                Reduce Output Operator
                  sort order:
                  Reduce Sink Vectorization: //reduce output向量化描述信息
                      className: VectorReduceSinkOperator
                      native: false
                      //已满足Reduce Sink使用向量化模式的条件
                      nativeConditionsMet:     hive.vectorized.execution.reducesink.new.enabled IS true, No TopN IS true, No DISTINCT columns IS true, BinarySortableSerDe for keys IS true, LazyBinarySerDe for values IS true
                      nativeConditionsNotMet: hive.execution.engine mr IN [tez, spark] IS false //使用mapredcue计算引擎不满足使用reduce sink向量化模式的条件,
                  value expressions: _col0 (type: bigint)
      Execution mode: vectorized
      Map Vectorization:
          …//同explain vectorization only 打印的map阶段向量化描述信息相同
      Reduce Vectorization:
          ... //同explain vectorization only 打印的reduce阶段向量化描述信息相同
      Reduce Operator Tree:
        Group By Operator
          aggregations: count(VALUE._col0)
          Group By Vectorization: //分组聚合的向量化描述信息
              vectorOutput: false
              native: false
          mode: mergepartial
          outputColumnNames: _col0
          Statistics: …//省略统计信息
          File Output Operator
           	…//省略文件输出的信息

从上面的信息,可以看到使用explain vectorization operator能显示每一个操作步骤是否能用上向量化执行模式,能用上向量化模式,已满足的条件条件具体有哪些,不能用上向量化模式,还需要满足的条件有哪些。

使用explain vectorization expression命令能够显示SQL表达式的向量化信息,包括explain vectorization summary和operator的信息,具体表现见案例6.12。

案例6.12 explain vectorization expression命令的使用

set hive.vectorized.execution.enabled=true;
explain vectorization expression
select count(1) from test;
输出结果:
PLAN VECTORIZATION: //同operator打印的PLAN VECTORIZATION一致
STAGE DEPENDENCIES: //同operator打印的STAGE DEPENDENCIES一致
STAGE PLANS:
  Stage: Stage-1
    Map Reduce
      Map Operator Tree:
          TableScan
            alias: test
            Statistics: ...//统计信息
            TableScan Vectorization:
                native: true
                projectedOutputColumns: [0, 1] //表示表扫描后输出有两列
            Select Operator
              Select Vectorization:
                  className: VectorSelectOperator
                  native: true
                  projectedOutputColumns: [] //表示进行列的筛选,因为整个SQL,也没有表中的任何一个列
              Statistics: ...//统计信息
              Group By Operator
                aggregations: count(1)
                Group By Vectorization: 
               //表示使用VectorUDAFCount的方法进行count计数操作,
               //操作完后以bigint的类型输出
                    aggregators: VectorUDAFCount(ConstantVectorExpression(val 1) -> 2:long) -> bigint
                    className: VectorGroupByOperator
                    vectorOutput: true
                    native: false
                    projectedOutputColumns: [0] //最终只输出一列
                mode: hash
                outputColumnNames: _col0
                Statistics: ...//省略统计信息的打印
                Reduce Output Operator 
                  .... // 同operator打印的Reduce Output Operator信息一致
      Execution mode: vectorized
      Map Vectorization:
          ...//同operator打印的Map Vectorization信息一致
      Reduce Vectorization:
          ...//同operator打印的Reduce Vectorization信息一致
      Reduce Operator Tree:
        Group By Operator
          aggregations: count(VALUE._col0)
          Group By Vectorization:
              vectorOutput: false
              native: false
              projectedOutputColumns: null //没有进行列的筛选,因为reduce阶段没有打开向量化的执行模式,所以这边向量化描述信息显示为null
          mode: mergepartial
          outputColumnNames: _col0
          Statistics: ...//省略统计信息
          File Output Operator
            ...//省略打印的输出信息

从上面的信息,可以看到在每个Vectorization的描述信息,会新增表示式相关的向量化描述信息,例如map阶段Group By Vectorization中的aggregators。

explain vectorization detail命令能够显示更加详细的向量化信息,这些信息包括explain vectorization summary/operator/expression等上面我们介绍的所有信息。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表