HIVE调优:EXPLAIN的用法及分析

文章目录

  • HIVE中EXPLAIN的用法
    • EXPLAIN语法
    • 例子
    • CBO 选项
    • AST 选项
    • DEPENDENCY 选项
    • AUTHORIZATION 选项
    • LOCKS 选项

HIVE中EXPLAIN的用法

EXPLAIN语法

HIVE提供了EXPLAIN命令来展示一个查询的执行计划。语法如下

EXPLAIN [EXTENDED|CBO|AST|DEPENDENCY|AUTHORIZATION|LOCKS|VECTORIZATION|ANALYZE] query

使用EXTENDED参数,会打印出有关运算符的更多的信息,比如文件名等。

一个HIVE查询被转换为一个由一个或多个stage组成的序列(有向无环图DAG)。这些stage可以是mapreduce stage,也可以是负责元数据存储的stage,也可以是负责文件系统的操作(比如移动和重命名)的stage。EXPLAIN的输出包含以下三部分:

  • 查询的抽象语法树
  • 执行计划中的不同stage的依赖关系
  • 每个stage的细致描述

这些stage自身的描述包含了一系列运算符,以及与这些运算符相关联的元数据。元数据可能包含filteroperator的filter表达式信息,或是select表达式信息,或是FileSinkOperator运算符的输出文件名等信息。

例子

以下面的查询作为一个例子

EXPLAIN
FROM src INSERT OVERWRITE TABLE dest_g1 SELECT src.key, sum(substr(src.value, 4)) GROUP BY src.key;

输出包含以下部分

  • 依赖图
STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-2 depends on stages: Stage-1
  Stage-0 depends on stages: Stage-2

可以看出,stage-1是根stage,stage-2在stage-1执行结束后执行,stage-0在stage-2执行结束后执行。

  • 每个stage的计划(plan)
STAGE PLANS:
  Stage: Stage-1
    Map Reduce
      Alias -> Map Operator Tree:
        src
            Reduce Output Operator  -- 根
              key expressions: -- key表达式(mapreduce是通过键值对来操作数据的)显示了为key的字段
                    expr: key
                    type: string
              sort order: + -- 表示只有一列数据升序排列(src.key)
              Map-reduce partition columns:
                    expr: rand()  -- partition的列,这里是随机划分
                    type: double
              tag: -1
              value expressions:  -- value表达式 显示了为value的字段
                    expr: substr(value, 4)
                    type: string
      Reduce Operator Tree:
        Group By Operator
          aggregations:
                expr: sum(UDFToDouble(VALUE.0))
          keys:
                expr: KEY.0
                type: string
          mode: partial1   - partial aggregation 聚合模式
          File Output Operator
            compressed: false
            table:
                input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                output format: org.apache.hadoop.mapred.SequenceFileOutputFormat
                name: binary_table
 -- 可以看出,stage-1中,进行了随机划分,而不是按照key进行划分的。先进行部分聚合,每个reducer中对具有相同key的值进行sum,再将结果传递给stage-2,进行完整的聚合。
 
  Stage: Stage-2
    Map Reduce
      Alias -> Map Operator Tree:
        /tmp/hive-zshao/67494501/106593589.10001
          Reduce Output Operator
            key expressions:
                  expr: 0  -- 0 即为src表中的`key`列
                  type: string
            sort order: +
            Map-reduce partition columns:
                  expr: 0
                  type: string
            tag: -1
            value expressions:
                  expr: 1 
                  type: double
                  
      Reduce Operator Tree:
        Group By Operator
          aggregations:
                expr: sum(VALUE.0)
          keys:
                expr: KEY.0
                type: string
          mode: final
          Select Operator
            expressions:
                  expr: 0
                  type: string
                  expr: 1
                  type: double
            Select Operator
              expressions:
                    expr: UDFToInteger(0)
                    type: int
                    expr: 1
                    type: double
              File Output Operator
                compressed: false
                table:
                    input format: org.apache.hadoop.mapred.TextInputFormat
                    output format: org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat
                    serde: org.apache.hadoop.hive.serde2.dynamic_type.DynamicSerDe
                    name: dest_g1
 -- 可见stage-2中的划分列变为了key(0是中间表的列别名)。

  Stage: Stage-0
    Move Operator
      tables:
            replace: true
            table:
                input format: org.apache.hadoop.mapred.TextInputFormat
                output format: org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat
                serde: org.apache.hadoop.hive.serde2.dynamic_type.DynamicSerDe
                name: dest_g1

-- 由上述分析可以发现,HIVE自动对我们的查询进行了优化,先随机partition,使得每个reducer中数据量相当,先部分聚合,再最终聚合,避免了数据倾斜问题。

在本例中,有两个map/reduce stage(stage-1和stage-2),和一个文件系统相关的stage(stage-0)。stage-0做的主要就是将结果从临时目录中移动到表dest_g1所在的目录中。

sort order表示key表达式中用来排序的列的数量。每个“+”代表有一列是升序排序,每个“-”代表有一列是降序排序。

一个map/reduce阶段包含两部分:

  • 表别名到map运算树的映射(mapping) - 这个映射告诉mappers调用哪一个运算树来对特定的表(或者之前的map/reduce stage的结果)进行运算。例子中的stage-1,src表中的数据行由以Reduce Output运算符为根的运算树进行处理。相似的,在stage-2中,stage-1的结果的数据行,由另外一个运算树进行处理,这个运算树以另外一个Reduce Output运算符为根。每个Reduce Output运算符将数据根据元数据中的准则,将数据划分到不同的reducer中。
  • 一个Reduce Operator Tree - 这个operator tree处理map/reduce job 中的reducer上的所有数据行。比如在stage-1中,Reducer Operator Tree执行了部分聚合(partial aggregate),而stage-2中的Reducer Operator Tree从stage-1计算出的部分聚合结果中计算出最终聚合。

CBO 选项

The CBO clause outputs the plan generated by Calcite optimizer. It can optionally include information about the cost of the plan using Calcite default cost model and cost model used for join reordering. Since Hive release 4.0.0 (HIVE-17503 / HIVE-21184).

AST 选项

输出查询的抽象语法树。

EXPLAIN AST
FROM src INSERT OVERWRITE TABLE dest_g1 SELECT src.key, sum(substr(src.value,4)) GROUP BY src.key;

输出为

ABSTRACT SYNTAX TREE:
  (TOK_QUERY (TOK_FROM (TOK_TABREF src)) (TOK_INSERT (TOK_DESTINATION (TOK_TAB dest_g1)) (TOK_SELECT (TOK_SELEXPR (TOK_COLREF src key)) (TOK_SELEXPR (TOK_FUNCTION sum (TOK_FUNCTION substr (TOK_COLREF src value) 4)))) (TOK_GROUPBY (TOK_COLREF src key))))

DEPENDENCY 选项

AUTHORIZATION 选项

LOCKS 选项

reference

  1. https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Explain

你可能感兴趣的:(HIVE)