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
- https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Explain