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类似与hiveQL转化的Mapreduce的语言解释器。
用户提交hiveQL会被提交给驱动器driver,驱动器将语句交给解释器进行分析,解释器compiler根据语句去元数据集metastore请求需要的数据,元数据集给解释器返回数据,解释器将分析好的任务再次返回启动器,驱动器给执行器发布执行命令。最后执行器根据得到的执行机会去和hadoop集群交互。
MapReduce实现HiveQL
1.mapreduce实现join
实现的过程是在Map阶段将来自哪个表的数据打上标签,在reduce阶段,按标签区分不同的列,按key来进行数据的合并。
2.MapReduce实现groupy
在map阶段将字段组合为key值,将value值设为统计的次数,在reduce阶段直接进行合并。
3.Mapreduce实现distinct
当只有一个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数据模型
分区表:
分区:把数据放在不同的磁盘文件中,就认为是不同的分区,数据库对不同的分区会进行单独的管理,优化,最终的目的是加快我们数据查询的速度,在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;
具有良好的扩展性和容错性;
适合快速交互式查询