Hive SQL转化为MapReduce的过程

  编译 SQL 的任务是在 COMPILER(编译器组件)中完成的。Hive将SQL转化为MapReduce任务,整个编译过程分为六个阶段:
              Hive SQL转化为MapReduce的过程_第1张图片

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

    Antlr是一种语言识别的工具,可以用来构造领域语言。使用Antlr构造特定的语言只需要编写一个语法文件,定义词法和语法替换规则即可,Antlr完成了词法分析、语法分析、语义分析、中间代码生成的过程。

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

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

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

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

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

下面对这六个阶段详细解析:

为便于理解,我们拿一个简单的查询语句进行展示,对5月25号的地区维表进行查询:

select * from dim.dim_region where dt = '2021-05-25';

阶段一:词法、语法解析

​ 根据Antlr定义的sql语法规则,将相关sql进行词法、语法解析,转化为抽象语法树AST Tree:

ABSTRACT SYNTAX TREE:
TOK_QUERY
    TOK_FROM 
    TOK_TABREF
           TOK_TABNAME
               dim
                 dim_region
    TOK_INSERT
      TOK_DESTINATION
          TOK_DIR
              TOK_TMP_FILE
        TOK_SELECT
          TOK_SELEXPR
              TOK_ALLCOLREF
        TOK_WHERE
          =
              TOK_TABLE_OR_COL
                  dt
                    '2021-05-25'

阶段二:语义解析

​ 遍历AST Tree,抽象出查询的基本组成单元QueryBlock:

​ AST Tree 生成后由于其复杂度依旧较高,不便于翻译为mapreduce程序,需要进行进一步抽象和结构化,形成QueryBlock。

​ QueryBlock 是一条SQL最基本的组成单元,包括三个部分:输入源,计算过程,输出。简单来讲一个QueryBlock 就是一个子查询。

​ QueryBlock 的生成过程为一个递归过程,先有序遍历AST Tree,遇到不同的Token节点,保存到相应的属性中。

阶段三:生成逻辑执行计划

​  遍历QueryBlock,翻译为执行操作数OpeatorTree

  Hive 最终生成的MapReduce任务,Map阶段和Reduce阶段均有OpeatorTree组成。

  基本操作符包括:T
    ableScanOperator
    SelectOperator
    FilterOperator
    oinOperator
    GroupByOperator
    ReduceSinkOperator

​  由于Join/GroupBy/OrderBy均需要在Reduce阶段完成,所以在生成相应操作的Operator之前都会先生成一个ReduceSinkOperator,将字段组合并序列化为Reduce Key/value, Partition Key。

阶段四:优化逻辑执行计划

Hive中的逻辑查询优化可以大致分为以下几类:

  • 投影修剪
  • 推导传递谓词
  • 谓词下推
  • 将Select-Select,Filter-Filter合并为单个操作
  • 多路 Join
  • 查询重写以适应某些列值的Join倾斜

阶段五:生成物理执行计划

​ 生成物理执行计划即是将逻辑执行计划生成的OpeatorTree转化成MapReduce Jon的过程,主要分为下面几个阶段:

  • 对输出表生成MoveTask
  • 从OperatorTree的其中一个根节点向下深度优先遍历
  • ReduceSinkOperator标示Map/Reduce的界限,多个Job间的界限
  • 遍历其他根节点,遇过碰到JoinOperator合并MapReduceTask
  • 生成StatTask更新元数据
  • 剪断Map与Reduce间的Operator的关系

阶段六:优化物理执行计划

Hive中的物理优化可以大致分为以下几类:

  • 分区修剪(Partition Pruning)
  • 基于分区和桶的扫描修剪(Scan pruning)
  • 如果查询基于抽样,则扫描修剪
  • 在某些情况下,在 map 端应用 Group By
  • 在 mapper 上执行 Join
  • 优化 Union,使Union只在 map 端执行
  • 在多路 Join 中,根据用户提示决定最后流哪个表
  • 删除不必要的 ReduceSinkOperators
  • 对于带有Limit子句的查询,减少需要为该表扫描的文件数
  • 减少用户提交的SQL查询所需的Tez作业数量
  • 如果是简单的提取查询,避免使用MapReduce作业
  • 对于带有聚合的简单获取查询,执行不带 MapReduce 任务的聚合
  • 重写 Group By 查询使用索引表代替原来的表
  • 当表扫描之上的谓词是相等谓词且谓词中的列具有索引时,使用索引扫描

你可能感兴趣的:(hive,hive,sql,mapreduce)