(02)Hive SQL编译成MapReduce任务的过程

目录

一、架构及组件介绍

1.1 Hive底层架构

1.2 Hive组件

1.3 Hive与Hadoop交互过程

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

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

2.2 程序入口—CliDriver

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

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

词法、语法解析

2.3.2 将AST转换成TaskTree

语义解析

 生成逻辑执行计划

优化逻辑执行计划

 生成物理执行计划

 HQL编译成MapReduce具体原理

JOIN

 GROUP BY

DISTINCT

优化物理执行计划 

2.3.3 提交任务并执行


一、架构及组件介绍

1) Hive简介

  •  Hive是Facebook实现的一个开源的数据仓库工具。
  • 将结构化的数据文件映射为数据库表,并提供HQL查询功能,将HQL语句转化为MapReduce任务运行

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

  • Hive 处理的数据存储在 HDFS
  • Hive 分析数据底层的实现是 MapReduce
  • 执行程序运行在 Yarn

1.1 Hive底层架构

1.2 Hive组件

  • 用户接口:Client
  1. CLI:shell命令行
  2. JDBC/ODBC:Hive中的Thrift服务器允许外部客户端通过网络与Hive进行交互,类似于JDBC或ODBC协议
  3. WEBUI:通过浏览器访问Hive
  • 元数据:Metastore
      通常是存储在关系数据库如 mysql/derby中。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
  • Hadoop
数据利用 HDFS文件系统 进行存储,使用 MapReduce 进行计算。
  • 驱动器:Driver
  • 解析器(SQL Parser:将 SQL 字符串转换成抽象语法树 AST,这一步一般都用第 三方工具库完成,比如 antlr;对 AST 进行语法分析,比如表是否存在、字段是否存在、SQL 语义是否有误。
  • 编译器(Physical Plan:将 AST 编译生成逻辑执行计划。
  • 优化器(Query Optimizer:对逻辑执行计划进行优化。
  • 执行器(Execution:把逻辑执行计划转换成可以运行的物理计划。当下Hive支持MapReduce、Tez、Spark3种执行引擎

    Driver驱动器总结:完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,随后执行引擎调用执行。当下Hive支持MapReduce、Tez、Spark3种执行引擎。

1.3 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任务)

步骤6.1 / 6.2  /6.3 /6.4:执行引擎将这些阶段Stage的具体执行内容提交给对应的组件。在每个 Task(mapper/reducer) 任务中,从HDFS文件中读取与表相关的数据,并通过算子树依次传递。最终的数据集借助序列化器写入到临时的HDFS文件中。

  • 步骤7、8:临时HDFS文件的内容由执行引擎读取后,通过Driver将查询结果发送给Client 客户端

简化版本:

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

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

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

2.2 程序入口—CliDriver

我们执行一个 HQL 语句通常有以下几种方式:
  • $HIVE_HOME/bin/hive进入客户端,然后执行HQL
  • $HIVE_HOME/bin/hive -e “hql”
  • $HIVE_HOME/bin/hive -fhive.sql
  • 先开启hivesever2服务端,然后通过JDBC方式连接远程提交HQL
 可以知道我们执行 HQL 主要依赖于 $HIVE_HOME/bin/hive  和  $HIVE_HOME/bin/
而在这两个脚本中,最终启动的 JAVA 程序的主类为
org.apache.hadoop.hive.cli.CliDriver ,所以其实 Hive程序的入口就是“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组成。

基本的操作符包括:

  1. TableScanOperator
  2. SelectOperator

  3. FilterOperator

  4. JoinOperator

  5. GroupByOperator

  6. ReduceSinkOperator

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

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

  • 优化逻辑执行计划

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

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

  1. 投影修剪

  2. 谓词下推

  3. 多路 Join

  •  生成物理执行计划

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

 HQL编译成MapReduce具体原理

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

 在Hive中,有些简单任务既可以转化为MR任务,也可以Fetch本地抓取,即直接读取table对应的hdfs存储目录下文件得到结果,通过hive.fetch.task.conversion参数配置。默认情况使用参数more,例如:SELECTFILTERLIMIT等简单查找都使用Fetch本地抓取,而其他复杂sql转为MR任务。

 (2)转化为MR任务的SQL

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

  • JOIN

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

  • Map: 生成键值对,以join on 条件中的列作为key,以join之后所关心的列作为value值,在value中还会包含表的Tag信息,用于标明此value对应哪张表
  • Shuffle: 根据key值进行hash分区, 按照hash值将键值对(key-value)发送到不同的reducer中
  • Reduce:Reducer通过Tag来识别不同的表中的数据,根据key值进行join操作

  以下列sql为例:

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

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

  •  GROUP BY

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

  • Map: 生成键值对,以GROUP BY条件中的列作为key,以聚集函数的结果作为value
  • Shuffle: 根据key值进行hash分区, 按照hash值将键值对(key-value)发送到不同的reducer中
  • Reduce:根据SELECT子句的列以及聚集函数进行Reduce

以下列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(任务树,即物理执行计划)进行物理优化;

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

  1. 分区修剪(Partition Pruning)

  2. 基于分区和桶的扫描修剪(Scan pruning)

  3. 在某些情况下,在 mapper端进行 Group By分组的预聚合

  4. 在 mapper端执行Join(map join)

  5. 如果是简单的select查询,可以设置为本地执行,避免使用MapReduce作业

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

2.3.3 提交任务并执行

  • 获取MR临时工作目录
  • 定义Partitioner
  • 定义Mapper和Reducer
  • 实例化Job任务
  • 提交Job任务并执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/471477.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于保存int型变量进int型数组的做法

如何保存int型变量进int型数组呢&#xff0c;大家先来看看我写的这串代码&#xff1a; #include <bits/stdc.h>using namespace std; int main(){int n;cin >> n;int num;vector<int>a;for (int i 1;i<n;i){cin >> num;if(num % 2 ! 0){a.push_ba…

neo4j下载安装最新教程 2024.02

文章目录 neo4j简介neo4j与jdk版本对应neo4j历史版本 下载地址配置环境变量命令行启动验证安装结果 neo4j简介 Neo4j 是一个高性能的 NoSQL 图形数据库&#xff0c;它将结构化数据存储在网络&#xff08;从数学角度叫做图&#xff09;上而不是表中。Neo4j 也可以被看作是一个高…

在线黑色响应式全屏滚动主页html源码

html5黑色大气的个人博客全屏滚动个人主页源码 右键记事本即可修改 直接上传服务器空间就可使用

2月12号

第一种判断方式 if (n 10) 更好&#xff0c;因为它具有更好的可读性、可以避免误操作&#xff0c;并符合常见的编程习惯和约定

OpenAI 文生视频大模型Sora,看完别说WC啊

OpenAI&#xff0c;发布了他们的文生视频大模型Sora&#xff08;Sora 是一个 AI 模型&#xff0c;可以根据文本指令创建现实且富有想象力的场景&#xff09; 来感受下震撼视觉冲击&#xff0c;看看你有没有说WC… 地址&#xff1a;sora 提示&#xff1a;一位时尚女性走在充满…

小米米家智能摄像头mp4多碎片手工恢复案例

小米米家智能摄像头mp4多碎片手工恢复案例 智能摄像头品牌中小米算是绝对的大厂&#xff0c;其采用的方案也是比较成熟比较典型的&#xff1a;日志截图1分钟1个文件。小米米家的智能摄像头之前处理过很多&#xff0c;这次来讲一个比较特殊的案例。 故障存储: 32G TF卡 fat…

Java中的String类的常用方法(对于字符串的常用操作)

目录 一、获取指定索引的字符 二、 获取指定字符或者字符串的索引位置 三、判断字符串是否以指定内容开头或结尾 四、替换指定的字符或者是字符串 五、获取字符串的子串 六、将字符串转换为字符数组 七、比较字符串的内容是否相等 八、连接字符串 九、比较两个字符串的大…

【AIGC】Stable Diffusion的ControlNet参数入门

Stable Diffusion 中的 ControlNet 是一种用于控制图像生成过程的技术&#xff0c;它可以指导模型生成特定风格、内容或属性的图像。下面是关于 ControlNet 的界面参数的详细解释&#xff1a; 低显存模式 是一种在深度学习任务中用于处理显存受限设备的技术。在这种模式下&am…

(2024|ICLR,SVD,软加权正则化,推理时文本嵌入优化)文本到图像扩散模型的图像内容抑制

Get What You Want, Not What You Dont- Image Content Suppression for Text-to-Image Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 相关工作 3. 方…

【C++】---类和对象(中)默认成员函数 和 操作符重载

前言&#xff1a; 假如一个类中既没有成员变量也没有成员函数&#xff0c;那么这个类就是空类&#xff0c;空类并不是什么都没有&#xff0c;因为所有类都会生成如下6个默认成员函数&#xff1a; 一、构造函数 1、构造函数的定义及其特性 对于日期类对象&#xff0c;我们可…

VBA技术资料MF119:数据验证的添加与删除

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

如何在没有第三个变量的情况下进行两个变量交换大小

昨天我看到了一个很有意思的一个面试题&#xff1a;如何在没有第三个变量的情况下进行两个变量交换大小 大家再在平时进行两个变量交换大小的时候通常会进行将其中的一个赋值给第三个变量&#xff0c;借助第三个变量进行两个变量交换&#xff0c;如下&#xff1a; #include &…