0
点赞
收藏
分享

微信扫一扫

Github使用教程

兔八哥软件爱分享 2024-02-13 阅读 17

一、 Hive 底层执行架构

1) Hive简介

2) Hive本质:HQL 转化成 MapReduce 程序

1.1 Hive底层架构

  • 用户接口:Client

  • 元数据:Metastore

      通常是存储在关系数据库如 mysql/derby中。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。

  • Hadoop

      使用 HDFS 进行存储,使用 MapReduce 进行计算。

  • 驱动器:Driver

     Driver驱动器:完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。
生成的查询计划存储在 HDFS 中,随后有执行引擎调用执行。

1.2 Hive与Hadoop交互过程

上图的基本流程是:

  • 步骤1:Client 客户端调用 Driver的接口;
  • 步骤2:Driver驱动器为查询创建会话句柄,并将查询发送到 Compiler(编译器组件)生成执行计划;
  • 步骤3和4:编译器从元数据存储库中获取本次查询所需要的元数据;
  • 步骤5:编译器生成各个阶段Stage的执行计划,如果是一个MR任务,该执行计划分为两部分:Map Operator Tree(map端的执行计划树)和Reduce Operator Tree(reduce端的执行计划树),再将生成的逻辑执行计划发给Driver;
  • 步骤6:Driver将逻辑执行计划发给执行引擎Execution Engine;(将逻辑执行计划转化成具体的物理执行计划,即mr任务)
  • 步骤7、8:临时HDFS文件的内容由执行引擎读取后,通过Driver将查询结果发送给Client 客户端

简化版本:

总结:Hive通过给用户提供的一系列交互接口,接收到用户的指令(sql),使用自己的driver,结合元数据(metastore),将这些指令翻译成 mapreduce任务,提交到hadoop中执行,最后将执行返回的结果输出到用户交互接口。

二、Hive SQL 编译成MR任务的流程

2.1 HQL转换为MR源码整体流程介绍

2.2 程序入口—CliDriver

2.3 HQL编译成MR任务的详细过程—Driver

2.3.1 将HQL语句转换成AST抽象语法树

     词法、语法解析:

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

 例如:AST如下图:

2.3.2 将AST转换成TaskTree

  •    语义解析

         遍历 AST Tree,抽象出一条SQL最基本组成单元 QueryBlock(查询块),该块包括三个部分:输入源,计算过程,输出。简单而言一个QueryBlock就是一个子查询。

  •    生成逻辑执行计划

         遍历 QueryBlock,翻译为执行操作树 OperatorTree(操作树,也就是逻辑执行计划);Hive最终生成的MapReduce任务,Map阶段和Reduce阶段均由OperatorTree组成。

     Operator操作算子在Map Reduce阶段之间的数据传递是一个流式的过程。每一个Operator对一行数据操作之后将数据传递给childOperator计算。

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

  • 优化逻辑执行计划

      逻辑优化器对OperatorTree(操作树)进行逻辑优化。例如合并不必要的ReduceSinkOperator,减少数据传输及 shuffle 数据量; 

  •  生成物理执行计划

       遍历 OperatorTree,转换成TaskTree(任务树,即物理执行计划)即MR任务。生成物理执行计划即是将逻辑执行计划生成的OperatorTree转化为MapReduce Job的过程。

 HQL编译成MapReduce具体原理

  (1) hive.fetch.task.conversion参数

 (2)转化为MR任务的SQL

       需要转换成MR任务的sql通常会涉及到key值的shuffle,例如:join、groupby、distinct等,接下来介绍此三种情况的sql转化

  • JOIN

JOIN任务转化为MR任务的流程如下:

  以下列sql为例:

SELECT pageid, 
       age 
FROM page_view 
JOIN userinfo 
ON page_view.userid = userinfo.userid; 

 sql转化为mr任务流程如下图:

  •  GROUP BY

  GROUP BY任务转化为MR任务的流程如下:

以下列sql为例:

SELECT pageid,
       COUNT(1) as num
FROM page_view
GROUP BY pageid;

sql转化为mr任务流程如下图:

  • DISTINCT

      与GROUP BY操作相同,只是键值对中的value可为空。

以下列sql为例:

SELECT DISTINCT pageid FROM page_view;

待补充~

  • 优化物理执行计划 

       物理优化器对进行TaskTree(任务树,即物理执行计划)进行物理优化;

    经过2.3.1 及2.3.2 这六个阶段,HQL就被解析映射成了集群上的 MR任务。

2.3.3 提交任务并执行

举报

相关推荐

0 条评论