分享

Hive stage划分

问题导读


1.Parser是什么?
2.语法分析器的作用是什么?
3.逻辑计划生成器的作用是什么?


若想知道Hive stage是怎么划分的,需要对Hive的架构有些了解,下面通过一张图来展示

Hive架构图

1.png

本文关心Hive是怎么划分stage的,而这一部分主要跟Compiler有关,所以我们先看看Compiler
Parser:解析器,解析查询语句,解析成解析树。

Semantic Analyser:语法分析器,将解析树转换成内部查询表示。对列名、类型做检查,类型转换、隐式转换也在这一阶段进行,这一步之后依然是基于Block的树,而不是操作符树。

Logical Plan Generator:逻辑计划生成器,将内部查询表示转换成逻辑计划。也就是这一阶段,就将基于Block的树转换成操作符树。有“filter”、"join"等代数操作符,也有hive特定的用于后续将这一计划转换成map-reduce任务的自有操作符。例如reduceSink操作符。每个操作符都包含一个可序列化的对象。

这里我们可以发现一点,Hive在执行查询时,需要划分为多少个map-reduce任务是根据Hive特定的操作符为界限来划分的。

那么这一阶段还干了什么:

优化器optimizer也在这一阶段起作用以提升查询性能
例如将一系列的join转换成单一join、将group by现在map端进行聚合、当出现数据倾斜,单一reduce可能出现瓶颈的时候将group by分成两个stage。
Query Plan Generator:查询计划生成器。将逻辑计划转换成 map-reduce 任务。reduceSink操作符为map-reduce的界限,其描述符包含reduction key,这一reduction key也用于在map-reduce边界中的键值。查询计划中包含所需的采样/分区。

从官网的描述来看,我们大概能知道Hive查询转换成MapReduce任务与reduceSink有关,也就是说Hive stage的划分的决定要素为reduceSink。

我们知道Spark在划分stage时是以宽依赖为边界的。Hive在生成执行计划的时候也存在依赖关系区分,上一阶段的输出作为下一阶段的输入,这为stage划分提供了主要依据。

Hive stage划分

在生成map-reduce任务时,Hive深度优先方式遍历Operator tree(操作符树),遇到第一个reduceSink操作符时,该操作符之前的操作符便划分到一个map-reduce任务的Map任务中,然后该reduceSink到下一个
reduceSink操作符之间的部分划分为map-reduce任务的Reduce任务。

一个完整的MapReduce阶段代表一个stage。当然Hive中还有非MapReduce的stage,在MapReduce为计算框架时,基本以MapReduce的stage为主,我们这里也只谈论这一stage。

由于Hive使用MapReduce计算引擎时无法直接使用不同阶段的结果。因此,每个阶段完成之后的结果都要输出到临时目录,供下一阶段读取,因此便将整个操作符图分解成不同的stage。

最新经典文章,欢迎关注公众号

本篇文章对Hive执行细节说的比较清楚,有兴趣的小伙伴可以了解下:
https://blog.csdn.net/jiayuanv_127/article/details/50936964
————————————————

原文链接:https://blog.csdn.net/weixin_43878293/article/details/102648655

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条