HIVE的执行计划实操

什么是执行计划

所谓执行计划,顾名思义,就是对一个查询任务(sql),做出一份怎样去完成任务的详细方案。举个生活中的例子,我从上海要去新疆,我可以选择坐飞机、坐高铁、坐火车,甚至于自驾。具体到线路更是五花八门,现在我准备选择自驾了,具体什么路线怎样去划算(时间&费用),这是一件值得考究的事情。HIVE(我们的自驾工具)提供了EXPLAIN命令来展示一个查询的执行计划(什么路线),这个执行计划对于我们了解底层原理,hive 调优,排查数据倾斜等很有帮助。

Explain呈现的执行计划,由一系列Stage组成,这一系列Stage具有依赖关系,每个Stage对应一个MapReduce Job,或者一个文件系统操作等。

若某个Stage对应的一个MapReduce Job,其Map端和Reduce端的计算逻辑分别由Map Operator Tree和Reduce Operator Tree进行描述,Operator Tree由一系列的Operator组成,一个Operator代表在Map或Reduce阶段的一个单一的逻辑操作,例如TableScan Operator,Select Operator,Join Operator等。

语法

explain +可选参数+查询语句

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

explain

查看执行计划的基本信息;

Formatted

按格式输出json格式

explain dependency

查看执行计划中输入源相关的额外信息;

以一个大JSON的方式展示处理,其中包含了input_tables 和 input_partitions两个字段,分别底层扫描的表和对应扫描的分区(如果表是分区表)

explain extended

查看执行计划的扩展信息;

explain cbo

输出由Calcite优化器生成的计划。CBO 从 Hive 4.0.0 版本开始支持;

 explain ast

输出查询的抽象语法树,主要用于开发或者高级用户通过查看抽象语法树发现问题。

AST 在 Hive 2.1.0 版本删除了,存在bug,转储AST可能会导致OOM错误,将在4.0.0版本修复;

explain authorization

查看SQL操作相关权限的信息;(存在授权失败的情况也会展示)

从 Hive 0.14.0 开始支持[HIVE-5961]

explain locks

这对于了解系统将获得哪些锁以运行指定的查询很有用。LOCKS 从 Hive 3.2.0 开始支持[HIVE-17683]

explain vectorization

查看SQL的向量化描述信息,从 Hive 2.3.0 开始支持;

 explain analyze

 用实际的行数注释计划。从 Hive 2.2.0 开始支持;

 案例实操

案例1:简单的sql

explain

select

id

,user_id

,product_id

from ds_hive.ch12_order_detail_orc t1

where substr(create_time,1,10)>='2023-01-01'

;

HIVE的执行计划实操_第1张图片

stage-1 

1. Map Operator Tree,首先进行表扫描(Table scan),预计扫描的行9643258 ,涉及的数据大小 3857303296,表别名为 t1 (这里没有给别名,如果给别名就是别名)

2. Filter Operator,行过滤操作,过滤的表达式是 substr(create_time, 110) >= '2023-01-01' ,预计处理的行是3214419 ,涉及的数据大小 1285767631

3. Select Operator,列过滤操作. 这个阶段,我建议采用这样的方式,先读最深的缩进。所以读起来是这样,

    3.1 处理的表,输入格式(input format)是org.apache.hadoop.mapred.SequenceFileInputFormat,输出格式是org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat 文件的序列化格式org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

    3.2 输出的文件预计是 3214419 ,涉及的数据大小 1285767631

    3.3 输出没有压缩

    3.4 一共输出了3214419列,由于mapreduce中所有的列都是按占位符来表示,所以这里都是用_col0[0-20]

    3.5 输出每一列表述的数据格式(expressions)

stage-0

1. Fetch Operator这表示客户端的取数操作

 其实执行计划是Hive根据统计信息所进行的简单描述,不是完全准确的执行计划,但是对了解其中的细节,对于这个sql的执行还是有很大的帮助。

两个部分

stage dependencies : 各个stage之间的依赖性

stage plan :各个stage的执行计划

Stage理解

结合对前面讲到的Hive对查询的一系列执行流程的理解,那么在一个查询任务中会有一个或者多个Stage.每个Stage之间可能存在依赖关系。没有依赖关系的Stage可以并行执行。

Stage是Hive执行任务中的某一个阶段,那么这个阶段可能是一个MR任务,也可能是一个抽取任务,也可能是一个Map Reduce Local ,也可能是一个Limit。

何时划分Stage

那么Stage划分的时机其实是发生在逻辑计划转化OperatorTree转化成物理计划的阶段TaskTree,按照深度优先遍历OperatorTree,再结合具体执行引擎的Compiler(MR/Tez/Spark)应用规则生成对应的Task。

Stage划分的界限决定于ReduceSinkOperator,在遇到ReduceSinkOperator之前的Operator都划分到Map阶段,同时也标识这Map阶段的结束。该ReduceSinkOperator到下一个ReduceSinkOperator阶段中间的部分划分为Reduce阶段。一个MR任务代表一个Stage(当然也包括其他非MR,如FetchTask、MoveTask、CopyTask)。

常见Operator

TableScan:表扫描操作

alias:表名称

Select Operator:选取操作

expressions:需要的字段名称及字段类型

outputColumnNames:输出的列名称

Group By Operator:分组聚合操作

aggregations:显示聚合函数信息

mode:有 hash:随机聚合,就是hash partition;partial:局部聚合;final:最终聚合

outputColumnNames:聚合之后输出列名

Statistics:表统计信息,包含分组聚合之后的数据条数,数据大小等

Reduce Output Operator:输出到reduce操作

sort order:值为空 不排序;值为 + 正序排序,值为 - 倒序排序;值为 ± 排序的列为两列,第一列为正序,第二列为倒序

Filter Operator:过滤操作

predicate:过滤条件,如sql语句中的where id>=1,则此处显示(id >= 1)

Map Join Operator:join 操作

condition map:join方式 ,如Inner Join 0 to 1 Left Outer Join0 to 2

keys: join 的条件字段

outputColumnNames:join 完成之后输出的字段

Statistics:join 完成之后生成的数据条数,大小等

File Output Operator:文件输出操作

compressed:是否压缩

Fetch Operator 客户端获取数据操作

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

你可能感兴趣的:(大数据,hive,大数据)