Hive 高级应用(三)之 Hive 执行过程实例分析

  • 1、Hive 执行过程概述
  • 1.1、Hive 操作符列表
  • 1.2、Hive 编译器的工作职责
  • 1.3、优化器类型
  • 2、Join
  • 2.1、实现过程
  • 2.2、具体实现过程
  • 3、Group By
  • 3.1、具体实现过程
  • 4、Distinct
  • 4.1、实现过程
  • 5、学习内容


1、Hive 执行过程概述

(1)Hive 将 HQL 转换成一组操作符(Operator),比如 GroupByOperator, JoinOperator 等;

(2)操作符 Operator 是 Hive 的最小处理单元;

(3)每个操作符代表一个 HDFS 操作或者 MapReduce 作业;

(4)Hive 通过 ExecMapper 和 ExecReducer 执行 MapReduce 程序,执行模式有本地模式和分布式两种模式。

hive 推测执行 hive执行流程_操作符

1.1、Hive 操作符列表

操作符

描述

TableScanOperator

扫描 hive 表数据

ReduceSinkOperator

创建将发送到 Reduce 端的 <Key, Value> 对

JoinOperator

join 两份数据

SelectOperator

选择输出列

FileSinkOperator

建立结果数据,输出至文件

FilterOperator

过滤输入数据

GroupByOperator

group by 语句

MapJoinOperator

/* + mapjoin(t) */

LimitOperator

Limit 语句

Unoin

Union 语句

1.2、Hive 编译器的工作职责

(1)Parser:将 HQL 语句转换成抽象语法树(AST:Abstract Syntax Tree);
(2)Semantic Analyzer:将抽象语法树转换成查询块;
(3)Logic Plan Generator:将查询块转换成逻辑查询计划;
(4)Logic Optimizer:重写逻辑查询计划,优化逻辑执行计划;
(5)Physical Plan Gernerator:将逻辑计划转化成物理计划(MapReduce Jobs);
(6)Physical Optimizer:选择最佳的 Join 策略,优化物理执行计划。

1.3、优化器类型

名称

作用

② SimpleFetchOptimizer

优化没有 Group By 表达式的聚合查询

② MapJoinProcessor

MapJoin,需要 SQL 中提供 hint,0.11 版本已不用

② BucketMapJoinOptimizer

BucketMapJoin

② GroupByOptimizer

Map 端聚合

① ReduceSinkDeDuplication

合并线性的 OperatorTree 中 partition/sort key 相同的 reduce

① PredicatePushDown

谓词前置

① CorrelationOptimizer

利用查询中的相关性,合并有相关性的 Job,HIVE-2206

ColumnPruner

字段剪枝

上表中带 ① 符号的,优化目的都是尽量将任务合并到一个 Job 中,以减少 Job 数量,带 ② 的优化目的是尽量减少 shuffle 数据量。

2、Join

对于 join 操作:

SELECT pv.pageid, u.age FROM page_view pv 
JOIN user u ON pv.userid = u.userid;

2.1、实现过程

(1)Map:
A、以 JOIN ON 条件中的列作为 Key,如果有多个列,则 Key 是这些列的组合;
B、以 JOIN 之后所关心的列作为 Value,当有多个列时,Value 是这些列的组合。在 Value 中还会包含表的 Tag 信息,用于标明此 Value 对应于哪个表;
C、按照 Key 进行排序。

(2)Shuffle:
A、根据 Key 的值进行 Hash,并将 Key/Value 对按照 Hash 值推至不同对 Reduce 中。

(3)Reduce:
A、Reducer 根据 Key 值进行 Join 操作,并且通过 Tag 来识别不同的表中的数据。

2.2、具体实现过程

hive 推测执行 hive执行流程_Hive 执行过程_02

3、Group By

对于 group by:

SELECT pageid, age, count(1) FROM pv_users 
GROUP BY pageid, age;

3.1、具体实现过程

hive 推测执行 hive执行流程_操作符_03

4、Distinct

对于 distinct:

SELECT age, count(distinct pageid) FROM pv_users 
GROUP BY age;

按照 age 分组,然后统计每个分组里面的不重复的 pageid 有多少个???

4.1、实现过程

详细过程解释:

该 SQL 语句会按照 age 和 pageid 预先分组,进行 distinct 操作。然后会再按照 age 进行分组,再进行一次 distinct 操作。

hive 推测执行 hive执行流程_Hive 执行过程_04

5、学习内容

上节学习内容:Hive 高级应用(二)之 Hive 数据倾斜 下节学习内容:Hive 高级应用(四)之 Hive 优化策略