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
- TableScan:表扫描操作,map端第一个操作肯定是加载表,所以就是表扫描操作,常见的属性:
- alias:表名称
- Statistics:表统计信息,包含表中数据条数,数据大小等
- Select Operator:选取操作,常见的属性 :
- expressions:需要的字段名称及字段类型
- outputColumnNames:输出的列名称
- Statistics:表统计信息,包含表中数据条数,数据大小等
- Group By Operator:分组聚合操作,常见的属性:
- aggregations:显示聚合函数信息
- mode:聚合模式,值有 hash:随机聚合,就是hash partition;partial:局部聚合;final:最终聚合
- keys:分组的字段,如果没有分组,则没有此字段
- 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:是否压缩
- table:表的信息,包含输入输出文件格式化方式,序列化方式等
- Fetch Operator 客户端获取数据操作,常见的属性:
- limit,值为 -1 表示不限制条数,其他值为限制的条数
四、图示Explain执行计划
最后我用图标注了每行的意思,可以作为参考