Hive底层原理

目录

第六章HIve SQL底层执行原理和源代码解析

6.1 HIve底层执行架构

6.2 HIve底层执行原理

6.3 HIve编译成MapReduce过程

6.4 HIve编译成MapReduce原理

6.4.1 Join的实现原理

6.4.2 Group by的实现原理

6.4.3 distinct的实现原理


第六章HIve SQL底层执行原理和源代码解析

6.1 HIve底层执行架构

在Hive这一侧,总共有5个组件:

Hive底层原理_第1张图片

  • UI:用户界面,可以看作我们提交SQL语句的命令行界面。

  • Driver:驱动程序。接受查询的组件,该组件实现了会话句柄的概念。

  • Compile:编译器:负责将SQL转化为平台可执行的执行计划。对不同的查询块和查询表达式进行语义分析,并最终借助表和metastore查找的分区元数据来生成执行计划。

  • MetaStore:元数据库。存储Hive中各种表和分区的所有结构信息。

  • Execution Engine:执行引擎,负责提交compiler阶段编译好的执行计划到不同的平台上。

上图的基本流程是:

  • UI调用driver的接口;

  • driver为查询创建会话句柄,并将查询发送到Compiler(编译器)生成执行计划;

  • 编译器从元数据存储中获取本次查询所需的元数据,该数据用于对查询树中的表达式进行类型检查,以及基于查询谓词修建分区;

  • 编辑器生成的计划是分阶段的DAG,每个阶段要么是map/reduce作业,要么是一个元数据或者HDFS上的操作,将生成的计划发给driver。如果是map/reduce作业,该计划包括map operator trees和一个reduce operator tree,执行引擎将会把这些作业发送给MapReduce

  • 执行引擎将这些阶段提交给适当的组件。在每个task(mapper/reducer)中,从HDFS文件中读取与表或中间输出相关联的数据,并通过相关算子树传递这些数据。最终这些数据通过序列化器写入一个临时HDFS文件中(如果不需要reduce阶段,则在map中操作)。临时文件用于向计划中后面的map/reduce阶段提供数据。

  • 最终的临时文件将移动到表的位置,确保不读脏数据,对于用户的查询,临时文件的内容由执行引擎直接从HDFS读取,然后通过driver发送到UI。

6.2 HIve底层执行原理

6.3 HIve编译成MapReduce过程

        编译SQL的任务是在上节中介绍的compiler(编辑器组件)中完成的。Hive将SQL转化为MapReduce任务,整个编译过程分为6个阶段:

  • 词法,语法解析:定义SQL的语法规则,完成SQL词法,词法解析,将SQL转化为抽象语法树AST Tree;

  • 语义解析:遍历AST Tree,抽象出查询的基本组成单元QueryBlock;

  • 生成逻辑执行计划:遍历QueryBlock,翻译为执行操作树OperatorTree;

  • 优化逻辑执行计划:逻辑层优化器进行OperatorTree变换,合并Operator,达到减少MapReduce Job,减少数据传输以及shuffle数据量;

  • 生成物理执行计划:遍历OperatorTree,翻译为MapReduce任务;

  • 优化物理执行计划:物理层优化器进行MapReduce任务的变换,生成最终的执行计划。

6.4 HIve编译成MapReduce原理

6.4.1 Join的实现原理

        

        样例:select u.name, o.orderid from order o join user u on o.uid = u.uid;

 在map 的输出 value 中为不同表的数据打上 tag 标记,在 reduce 阶段根据 tag 判断数据来源。MapReduce 的过程如下:

Hive底层原理_第2张图片

6.4.2 Group by的实现原理

        样例:select rank, isonline, count(*) from city group by rank, isonline;

        过程:将group by的字段组合为map的输出key值,利用MapReduce的排序,在reduce阶段保存LastKey区分不同的key。MapReduced过程如下:

Hive底层原理_第3张图片

6.4.3 distinct的实现原理

        样例:select dealid, count(distinct uid) num from order group by dealid

        过程:当只有一个distinct字段的时候,如果不考虑Map阶段的Hash GroupBy,只需要将GroupBy字段作为reduce的key,在reduce阶段保存LastKey即可完成去重。

Hive底层原理_第4张图片

你可能感兴趣的:(#,HIve,大数据,hive,big,data,hadoop)