前言
相信大家通过学习MapReduce,已经认识到hadoop利用多台廉价机器集群进行并行计算的优势,了解了HDFS、Yarn、MapReduce的工作原理,也对hadoop生态体系有了一定的了解。
但是问题也随之出现,我们对MapReduce程序并不了解,编写起来语法也比较复杂,这无疑降低了我们的开发效率。这时,我们就要用到Hive。
因此,通俗地讲,Hive本质上就是让我们通过类SQL的语法来编写MapReduce程序。我们写好的sql,Hive会帮我们自动转为顶层的MapReduce程序,并对数据(通常存放在HDFS上)进行操作。
一、hive的特点
1)可扩展
Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。
2)延展性
Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
3)良好的容错性
Hive具有良好的容错性,节点出现问题SQL仍可完成执行。
二、hive体系架构及基本原理
Hive的体系架构以及其处在Hadoop生态体系中的位置如下所示:
服务器组件:
-
Driver组件:该组件包括Complier、Optimizer和Executor,它的作用是将我们写的HiveQL(类SQL)语句进行解析、编译优化,生成执行计划,然后调用底层的mapreduce计算框架。
-
Metastore组件:元数据服务组件,这个组件存储hive的元数据,hive的元数据存储在关系数据库里,hive支持的关系数据库有derby、mysql。元数据对于hive十分重要,因此hive支持把metastore服务独立出来,安装到远程的服务器集群里,从而解耦hive服务和metastore服务,保证hive运行的健壮性,这个方面的知识,我会在后面的metastore小节里做详细的讲解。
-
Thrift服务:thrift是facebook开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,hive集成了该服务,能让不同的编程语言调用hive的接口。
客户端组件:
-
CLI:command line interface,命令行接口。
-
Thrift客户端:上面的架构图里没有写上Thrift客户端,但是hive架构的许多客户端接口是建立在thrift客户端之上,包括JDBC和ODBC接口。
下面着重讲讲上述服务器组件中的metastore组件,具体如下:
Hive的metastore组件是hive元数据集中存放地。Metastore组件包括两个部分:metastore服务和后台数据的存储。后台数据存储的介质就是关系数据库,例如hive默认的嵌入式磁盘数据库derby,以及我们在实际开发中运用较多的mysql数据库。
Metastore服务是建立在后台数据存储介质之上,并且可以和hive服务进行交互的服务组件,默认情况下,metastore服务和hive服务是安装在一起的,运行在同一个进程当中。我也可以把metastore服务从hive服务里剥离出来,metastore独立安装在一个集群里,hive远程调用metastore服务,这样我们可以把元数据这一层放到防火墙之后,客户端访问hive服务,就可以连接到元数据这一层,从而提供了更好的管理性和安全保障。使用远程的metastore服务,可以让metastore服务和hive服务运行在不同的进程里,这样也保证了hive的稳定性,提升了hive服务的效率。
三、Hive的存储
由于Hive本质上是再MapReduce程序进行了封装,因此Hive中所有的数据都存储在 HDFS 中,基本单位为HDFS中的HFILE,并没有专门的数据存储格式。
Hive 中包含以下数据模型:DB、Table,External Table,Partition,Bucket。
db:在hdfs中表现为${hive.metastore.warehouse.dir}目录下一个文件夹
table:在hdfs中表现所属db目录下一个文件夹
external table:外部表, 与table类似,不过其数据存放位置可以在任意指定路径
注:普通表与外部表(External Table)最大的区别是:普通表被删除了就完全被删除了,而外部表被删除后只是被移除了元数据,其本身存在的数据任然存储在原来的HDFS中,并没有丢失。
partition:在hdfs中表现为table目录下的子目录
bucket:桶, 在hdfs中表现为同一个表目录下根据hash散列之后的多个文件, 会根据不同的文件把数据放到不同的文件中
四、总结
本篇文章对Hive的原理进行了简单介绍。接下来的文章中,我将介绍我在安装和使用hive中实用的知识和实用语法,也会更新我最近自己在学习Hive的过程中做的实战项目,让我们在具体实践中感受Hive带来的魅力!