大数据的仓库Hive原理(三)

来源:互联网 发布:数据库是什么文件 编辑:程序博客网 时间:2024/04/19 15:24

      上次我们简单说了一下Hive的工作原理,今天我们来深入看一下它是如何把Hql语句转换为m/r来运行的。

1、编译器

  • 简介

          Hive编译器将一个Hive QL转换操作符。操作符Operator是Hive的最小的处理单元,每个操作符代表HDFS的一个操作或者一道MapReduce作业。
    Operator都是hive定义的一个处理过程,其定义有:

    protected List <Operator<? extends Serializable >> childOperators; protected List <Operator<? extends Serializable >> parentOperators; protected boolean done;   // 初始化值为false

          所有的操作构成了Operator图,hive正是基于这些图关系来处理诸如limit, group by, join等操作。

    这里写图片描述

  • 执行流程

    这里写图片描述

2、转换过程

Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree
遍历AST Tree,抽象出查询的基本组成单元QueryBlock
遍历QueryBlock,翻译为执行操作树OperatorTree
逻辑层优化器进行OperatorTree变换,合并不必要的
ReduceSinkOperator,减少shuffle数据量
遍历OperatorTree,翻译为MapReduce任务物理层优化器进行MapReduce任务的变换,生成最终的执行计划

3、具体实现

  • Join的实现原理

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

          在map的输出value中为不同表的数据打上tag标记,在reduce阶段根据tag判断数据来源。MapReduce的过程如下(这里只是说明最基本的Join的实现,还有其他的实现方式)

    这里写图片描述

  • Group By的实现原理

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

          将GroupBy的字段组合为map的输出key值,利用MapReduce的排序,在reduce阶段保存LastKey区分不同的key。MapReduce的过程如下(当然这里只是说明Reduce端的非Hash聚合过程)

    这里写图片描述

  • Distinct的实现原理

    select dealid, count(distinct uid) num from order group by dealid;

          当 只有一个distinct字段时,如果不考虑Map阶段的Hash GroupBy,只需要将GroupBy字段和Distinct字段组合为map输出key,利用mapreduce的排序,同时将GroupBy字段作 为reduce的key,在reduce阶段保存LastKey即可完成去重

    这里写图片描述


总结:

      我们从认识Hive到理解它的运行原理,已经对其有了一定的了解。当然在实际应用中还会遇到各种问题,只要我们坚持去做,就没有什么做不到的。

1 0