(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.mfbz.cn/a/390024.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于蓄电池和飞轮混合储能系统的SIMULINK建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 蓄电池储能原理 4.2 飞轮储能原理 4.3 混合储能系统原理 5.完整工程文件 1.课题概述 基于蓄电池和飞轮混合储能系统的SIMULINK建模与仿真。蓄电池和飞轮混合储能,蓄电池可以用SIMULINK…

私立医院患者大数据分析平台建设方案

一、项目目标 1、数据质量,统计数字不仅是真实可信,而且要及时,便于及时判断企业经营情况,同时通过内外部数据的对标,发现企业经营问题。 2、提供指标的监控预警,为决策提供支持,减少杂乱无用报表的生产。 3、提升数据处理效率,提高报表的可用性,让数据标准化,提高…

寒假 6

1.现有无序序列数组为{23,24,12,5,33,5,34,7}&#xff0c;请使用以下排序实现编程。 函数1:请使用冒泡排序实现升序排序 函数2︰请使用简单选择排序实现升序排序 函数3:请使用直接插入排序实现升序排序 函数4∶请使用插入排序实现升序排序 #include <stdio.h> #inclu…

代码随想录 Leetcode860. 柠檬水找零

题目&#xff1a; 代码(首刷自解 2024年2月15日&#xff09;&#xff1a; class Solution { public:bool lemonadeChange(vector<int>& bills) {vector<int> leftchange(2,0);//leftchange[0]代表5元数量&#xff0c;1代表10for (int i 0; i < bills.size…

多线程面试题汇总

多线程面试题汇总 一、多线程1、线程的生命周期2、线程的创建&#xff08;函数创建&#xff09;3、线程的创建&#xff08;使用类&#xff09;4、守护线程 二、全局解释器锁1、使用单线程实现累加到5000000002、使用多线程实现累加到5000000003、总结 三、线程安全1、多线程之数…

基于SSM的社区疫情防控管理系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的社区疫情防控管理系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spri…

蓝桥杯真题:扑克牌移动

import java.util.*; public class Main {public static List moveCard(List src){if(srcnull) return null;List dst new Vector();for(;;){if(src.size()0) break; // 填空src.add(src.remove(0));//remove(0) 是一个 List 接口中的方法调用&#xff0c;它表示移除列表中指…

163基于matlab的不同目标函数的盲源信号分离基于负熵的

基于matlab的不同目标函数的盲源信号分离基于负熵的&#xff1b;基于负熵的改进算法&#xff1b; 基于峭度的&#xff1b;基于互信息的&#xff1b;基于非线性PCA的。输出解混前后信号结果。程序已调通&#xff0c;可直接运行。 163 负熵、峭度、互信息、PCA 信号处理 (xiaohon…

面试突击1

1.当线程没有拿到资源时&#xff0c;用户态和内核态的一个切换 在操作系统中&#xff0c;进程和线程是执行程序的基本单位。为了管理这些单位&#xff0c;操作系统使用了一种称为“进程状态”的机制&#xff0c;其中包括用户态和内核态两种状态。这两种状态代表了进程或线程在…

通过玩游戏学会AWS

游戏名字&#xff1a; Cloud Quest 类型&#xff1a;亚马逊云科技官方出了一款 3D 角色扮演、虚拟城市建造形式的游戏实验课 进入方法&#xff1a;浏览器搜索 Cloud Quest&#xff08;或扫描下方二维码&#xff09;进入 Cloud Quest 课程页。 选择以下的链接 点击进行注册 进…

Java Web 中forward 和 redirect 的区别

前言 在Java Web开发中&#xff0c;页面跳转是构建用户界面和实现业务逻辑的重要组成部分。Forward&#xff08;转发&#xff09;和Redirect&#xff08;重定向&#xff09;是两种常见的跳转方式&#xff0c;它们分别具有不同的特点和适用场景。正确地选择和使用这两种跳转方式…

拿捏c语言指针(上)

目录 前言 ​编辑 指针 内存与地址 计算机常见单位 理解编址 取地址&#xff0c;指针变量&#xff0c;解引用 取地址 指针变量 解引用 指针变量大小 指针类型的作用 char*解引用后 指针-整数 应用 void*指针 const修饰指针变量 const修饰普通变量 const修饰指…

C++数据结构与算法——字符串

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

在已有代码基础上创建Git仓库

在已有代码基础上创建Git仓库 背景方法处理问题 背景 先进行了代码编写&#xff0c;后续想放入仓库方便大家一起合作开发&#xff0c;此时需要在已有代码的基础上建立仓库。 方法 首先在Gitee或者GitHub上创建仓库&#xff0c;这里以Gitee为例。创建完后&#xff0c;我们可以…

java8-用optional取代nu11

本章内容口nu11引用引发的问题&#xff0c;以及为什么要避免nu11引用从nu11到optiona1:以nu11安全的方式重写你的域模型让optiona1发光发热:去除代码中对nu11的检查 读取optiona1中可能值的几种方法口对可能缺失值的再思考 如果你作为Java程序员曾经遭遇过Nu11PointerException…

Excel导入预览与下载

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Excel导入预览与下载 preview Controller PostMapping("preview")ApiOperation("上传拒付预警预览")public Result<List<ResChargebackWa…

猫头虎分享已解决Bug ‍ || Java Error: Could not find or load main class com.example.Main

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

每日OJ题_算法_递归③力扣206. 反转链表

目录 力扣206. 反转链表 解析代码 力扣206. 反转链表 206. 反转链表 LCR 024. 反转链表 难度 简单 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,…

基于Java (spring-boot)和微信小程序的奶茶点餐小程序

一、项目介绍 基于Java (spring-boot)和微信小程序的奶茶点餐小程序功能&#xff1a;客户端登录、个人中心、点餐、选规格、去结算、取餐、我的信息、管理员登录、管理员首页、用户管理、商品管理、商品编辑、商品种类、订单管理、订单处理、等等等。 适用人群&#xff1a;适合…

MessageQueue --- RabbitMQ

MessageQueue --- RabbitMQ RabbitMQ IntroRabbitMQ 核心概念RabbitMQ 分发类型Dead letter (死信)保证消息的可靠传递 RabbitMQ Intro 2007年发布&#xff0c;是一个在AMQP&#xff08;高级消息队列协议&#xff09;基础上完成的&#xff0c;可复用的企业消息系统&#xff0c;…
最新文章