Hive工作原理

2023-09-18 16:14:14

Hive 工作原理详解-阿里云开发者社区

Hive的服务端组件

1. Driver组件:该组件包括:Compiler、Optimizer、Executor,它可以将Hive的编译、解析、优化转化为MapReduce任务提交给Hadoop1中的JobTracker或者是Hadoop2中的SourceManager来进行实际的执行相应的任务。

2. MetaStore组件:存储着hive的元数据信息,将自己的元数据存储到了关系型数据库当中,支持的数据库主要有:Mysql、Derby、支持把metastore独立出来放在远程的集群上面,使得hive更加健壮。元数据主要包括了表的名称、表的列、分区和属性、表的属性(是不是外部表等等)、表的数据所在的目录。

3. 用户接口:CLI(Command Line Interface)(常用的接口:命令行模式)、Client:Hive的客户端用户连接至Hive Server ,在启动Client的时候,需要制定Hive Server所在的节点,并且在该节点上启动Hive Server、WUI:通过浏览器的方式访问Hive。

Hive的工作原理

流程大致步骤为:

1. 用户提交查询等任务给Driver。

2. 编译器获得该用户的任务Plan。

3. 编译器Compiler根据用户任务去MetaStore中获取需要的Hive的元数据信息。

4. 编译器Compiler得到元数据信息,对任务进行编译,先将HiveQL转换为抽象语法树,然后将抽象语法树转换成查询块,将查询块转化为逻辑的查询计划,重写逻辑查询计划,将逻辑计划转化为物理的计划(MapReduce), 最后选择最佳的策略。

5. 将最终的计划提交给Driver。

6. Driver将计划Plan转交给ExecutionEngine去执行,获取元数据信息,提交给JobTracker或者SourceManager执行该任务,任务会直接读取HDFS中文件进行相应的操作。

7. 获取执行的结果。

8. 取得并返回执行结果。

创建表时:

解析用户提交的Hive语句-->对其进行解析-->分解为表、字段、分区等Hive对象。根据解析到的信息构建对应的表、字段、分区等对象,从SEQUENCE_TABLE中获取构建对象的最新的ID,与构建对象信息(名称、类型等等)一同通过DAO方法写入元数据库的表中,成功后将SEQUENCE_TABLE中对应的最新ID+5.实际上常见的RDBMS都是通过这种方法进行组织的,其系统表中和Hive元数据一样显示了这些ID信息。通过这些元数据可以很容易的读取到数据。

Hive编译过程

基本流程为:将HiveQL转化为抽象语法树再转为查询块然后转为逻辑查询计划再转为物理查询计划最终选择最佳决策的过程。

优化器的主要功能:

1. 将多Multiple join 合并为一个Muti-way join

2. 对join、group-by和自定义的MapReduce操作重新进行划分。

3. 消减不必要的列。

4. 在表的扫描操作中推行使用断言。

5. 对于已分区的表,消减不必要的分区。

6. 在抽样查询中,消减不必要的桶。

7. 优化器还增加了局部聚合操作用于处理大分组聚合和增加再分区操作用于处理不对称的分组聚合。

Hive的数据类型

注意:

1. 原子数据类型是可以进行隐式的转换的,例如tinyInt类型会自动转为Int类型但是不能由int自动转为tinyInt类型。

2. 所有的整数类型、Float和String类型都可以转换为Double类型。

3. TinyInt、SmallInt、Int都可以转为Float类型。

4. Boolean 类型不可以转换为其他的任何类型。

5. 可以通过使用Cast操作显示的进行数据转换,例如Cast('1' as int);将字符串转为整型,如果强制转换失败如:Cast('X' as int);表达式返回的是NULL;

Hive的特点

更多推荐

算法讨论题 —— Java实现两数之和

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。即:每个index上的数字只能用一次。示例给定nums=[2,7,11,15],target=9因为nums[0]+nums[1]=2+7=9所以返回[0,1]解答这个题目的原题是在:力扣(Leet

Zookeeper分布式锁的概念及原理

文章目录1.Zookeeper分布式锁的概念2.分布式锁的实现方式3.Zookeeper分布式锁的原理1.Zookeeper分布式锁的概念分布式锁的概念图如下:一种演变过程。在我们进行单机应用程序开发时,往往会涉及到并发同步的问题,一般都会采用synchronized或者Lock锁的方式来解决多线程间的代码同步问题,这

EM3DANI包详解:使用Julia语言进行3D频域电磁数据建模的终极指南

第一部分:EM3DANI包的简介与安装1.EM3DANI包简介EM3DANI是一个强大的工具包,专门为那些希望使用Julia语言进行频域电磁(CSEM和MT)数据的3D建模的研究者和开发者设计。它支持各向同性和各向异性建模,使得用户可以更加灵活地进行电磁数据的模拟和分析。频域电磁(CSEM和MT)技术在地球物理勘探、矿

Leetcode.2826 将三个组排序

题目链接Leetcode.2826将三个组排序rating:1721题目描述给你一个下标从000开始长度为nnn的整数数组numsnumsnums。从000到n−1n-1n−1的数字被分为编号从111到333的三个组,数字iii属于组nums[i]nums[i]nums[i]。注意,有的组可能是空的。你可以执行以下操作

[C语言]栈与队列——喵喵队,冲冲冲

宝子,你不点个赞吗?不评个论吗?不收个藏吗?最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!!喵喵喵,你对我真的很重要。目录前言栈栈的实现队列队列的实现总结前言实践,实践,实践,多练几遍力扣,牛客的题。落实到脚下。栈栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作

Ubuntu安装RabbitMQ server - 在外远程访问

文章目录前言1.安装erlang语言2.安装rabbitMQ3.内网穿透3.1安装cpolar内网穿透(支持一键自动安装脚本)3.2创建HTTP隧道4.公网远程连接5.固定公网TCP地址5.1保留一个固定的公网TCP端口地址5.2配置固定公网TCP端口地址前言RabbitMQ是一个在AMQP(高级消息队列协议)基础上完

单例模式的安全写法

要想知道怎么写单例模式,那么必须得知道什么是单例模式。单例模式是一种设计模式,它确保某个类只有一个实例,并且提供一个全局访问该实例的方法。单例模式不会创建实例副本,而是返回对已创建实例的引用。单例模式的创建可以分为两类。第一类是饿汉式单例模式,它在类加载时就创建了唯一的实例对象,并在全局范围内提供访问点。第二类是懒汉式

如何制作一个成功的超市购物小程序

随着互联网的普及和移动支付的便捷性,越来越多的消费者选择在网上购物,这也促使越来越多的商家开始搭建自己的小程序商城。对于超市便利店来说,拥有一个便捷、易用的小程序商城能够吸引更多的消费者,提高销售效率。那么如何快速搭建一个超市便利店小程序呢?下面我们将通过乔拓云平台来介绍这个过程。步骤1:登录乔拓云网后台,进入商城管理

rabbitmq 面试题

1.交换机类型RabbitMQ是一个开源的消息队列系统,它支持多种交换机类型,用于在消息的生产者和消费者之间路由和分发消息DirectExchange(直接交换机):Direct交换机是最简单的交换机类型之一。它将消息按照消息的RoutingKey(路由键)与绑定的队列的RoutingKey进行精确匹配,并将消息发送到

一键自助建站系统源码带安装教程 傻瓜式部署搭建,让您的建站更高效

在这个数字时代,网站已成为企业或个人展示形象、推广业务的重要工具。为了满足这一需求,许多自助建站系统应运而生,大大降低了用户建站的门槛。给大家分享一款傻瓜式部署搭建的一键自助建站系统源码,让您轻松拥有高效建站能力。一、一键自助建站系统源码介绍这款一键自助建站系统源码具有以下特点:简单易用:用户只需通过简单的鼠标点击和输

Golang Gorm 一对多 关联模式 Association + Find 查询关联

查找关联//User拥有并属于多种language,`user_languages`是连接表typeUserstruct{gorm.ModelLanguages[]Language`gorm:"many2many:user_languages;"`}typeLanguagestruct{gorm.ModelNamest

热文推荐