Hive 基本架构

2020-08-04 22:18:43 浏览数 (1)

hive是一个著名的离线处理的数据仓库,可以通过类SQL语言轻松的访问大量的数据集,也可以访问HDFS中的文件,但是其底层的实现是MapReduce,所以具有较高的可扩展性。但是hive不是RDBMS数据库。

hive具有明显的自己特色,它不支持数据更新,不支持事务和索引,但是具有了更小的分区---桶。同时其具有了并发处理大数据文件的能力。

我们可以认为Hive是MapReduce的翻译器。
Hive的缺点

HQL并非完全是SQL语法,很多复杂的语法无法实现,比如join操作,只支持等值连接,迭代的算法无法实现。

同时hive生成的mapReduce效率不会太高,基本上一个操作生成一个Map Reduce,一条语句可能生成很多Map Reduce ,一般可以使用Tez进行优化,但是效率要求高的地方一般需要自己写MapReduce来实现。

Hive架构

Hive和mySQL一样是C/S架构

client端包括 JDBC/ODBC Client和Thrift Client两类

Server端包括 CLI Thrift Server Metastore WUI Driver

Driver

Driver 每一个Hive服务都需要调用Driver来完成HQL语句的翻译和执行。通俗地说,Driver就是HQL编译器,它解析和优化HQL语句,将其转换成一个Hive Job(可以是MapReduce,也可以是Spark等其他任务)并提交给Hadoop集群。

Metastore

Metastore是Hive元数据的存储地。在功能上Metastore分为两个部分:服务和存储.hive服务和存储部署的三种模式:

1.内嵌模式 内嵌模式是Hive Metastore的最简单的部署方式,使用Hive内嵌的Derby数据库来存储元数据。但是Derby只能接受一个Hive会话的访问,试图启动第二个Hive会话就会导致Metastore连接失败。

2.本地模式 本地模式是Metastore的默认模式(懒人专用模式)。该模式下,单Hive会话(一个Hive 服务JVM)以组件方式调用Metastore和Driver。我们可以采用MySQL作为Metastore的数据库。下面列出部署细节:

在hive-site.xml中设置MySQL的Connection URL、用户名和密码以及ConnectionDriverName; 将MySQL的JDBC驱动Jar文件放到Hive的lib目录下。

3.远程模式 远程模式将Metastore分离出来,成为一个独立的Hive服务(Metastore服务还可以部署多个)。这样的模式可以将数据库层完全置于防火墙后,客户就不再需要用户名和密码登录数据库,避免了认证信息的泄漏。

  • hive.metastore.local false为远程模式
  • hive.metastore.uris 远端模式下Metastore的URI列表

hive查询过程

就如上文所示一样Hive类似与hiveQL转化的Mapreduce的语言解释器。

用户提交hiveQL会被提交给驱动器driver,驱动器将语句交给解释器进行分析,解释器compiler根据语句去元数据集metastore请求需要的数据,元数据集给解释器返回数据,解释器将分析好的任务再次返回启动器,驱动器给执行器发布执行命令。最后执行器根据得到的执行机会去和hadoop集群交互。

MapReduce实现HiveQL

1.mapreduce实现join

join.png

实现的过程是在Map阶段将来自哪个表的数据打上标签,在reduce阶段,按标签区分不同的列,按key来进行数据的合并。

2.MapReduce实现groupy

groupby.png

在map阶段将字段组合为key值,将value值设为统计的次数,在reduce阶段直接进行合并。

3.Mapreduce实现distinct

1distinct.png

当只有一个distinct字段时,如果不考虑Map阶段的Hash GroupBy,只需要将GroupBy字段和Distinct字段组合为map输出key,利用mapreduce的排序,同时将GroupBy字段作为reduce的key,在reduce阶段保存LastKey即可完成去重. 类似与groupby但是不执行合并,只是取最后一个数即可。

了解了MapReduce实现SQL基本操作之后,我们来看看Hive是如何将SQL转化为MapReduce任务的,整个编译过程分为六个阶段: Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree 遍历AST Tree,抽象出查询的基本组成单元QueryBlock 遍历QueryBlock,翻译为执行操作树OperatorTree 逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量 遍历OperatorTree,翻译为MapReduce任务 物理层优化器进行MapReduce任务的变换,生成最终的执行计划

Hive数据模型

clipboard.png

分区表: 分区:把数据放在不同的磁盘文件中,就认为是不同的分区,数据库对不同的分区会进行单独的管理,优化,最终的目的是加快我们数据查询的速度,在hive中,把不同的分区分在表中不同的子文件夹中.

桶表: 桶表和分区表的区别在于:不是按照业务字段来进行分区,对里面的记录做一个hash,记录做完hash之后就没有规律了,可以简单的认为数据做完hash之后都不相同,然后我们让数据进行模10,数据就被分成了十份,模100就被分成100份,因为hash值几乎各不相同,所以模后的结果,分成10份或者100份,每一份的数据量几乎是一样多的,当你hash之后然后模一个数字,分的那些数据量,每一份应该是差不多的,如果这样的话,我们把这样的数据存起来,模5,10,100 模的这个数字叫做桶,模几就分成几个桶,桶实际上就是模的数字,我们的记录就被划分到这个桶里面了,那么hive在进行查询的时候就会按照5个桶或者10个桶来进行处理,这样的话,好处是各个map运行的时间差不多.

数据类型

Hive发展

目前Hive的底层已经变为了Tez,Tez相比与MapReduce有很多的优势,提供了多种算子,可以将多个作业合并为一个作业,减少了IO,充分利用了内存的资源。

Impala

底层计算引擎不再采用MR,而是使用与商用并行关系数据库 类似的分布式查询引擎;

Impala可直接处理存储在HDFS上的数据,并将结果集再次写 入HDFS;

具有良好的扩展性和容错性;

适合快速交互式查询

0 人点赞