文章目录
什么是Hive?
Hive的特点
Hive的架构
元数据存储模式


什么是Hive?


  Hive最初是由FaceBook公司开发的一个基于Hadoop框架并且开源的一个数据仓库工具,后贡献给了Apache基金会由Apache来进行维护和更新。Hive可以将结构化的文件映射为一张数据表,但并不提供查询功能,而是将SQL转化为MapReduce任务进行运行。同时,Hive本身不存储数据,只是存储数据的路径或者操作信息,真的数据是存储在可靠的文件系统当中(如HDFS、Derby等)。

Hive的特点


  Hive的存储是架构在一个数据库中并将处理数据储存到HDFS上

  Hive专门为联机事务分析(OLAP)设计。

  Hive使用HSQL来提供SQL类型语言查询。

  Hive快速、简单并且可扩展。

Hive的架构

Hive的架构及元数据三种存储模式-LMLPHP

  由上图可知,Hive架构主要包括如下组件:CLI(command line interface)、JDBC/ODBC、Thrift Server、HWI(Hive WEB Interface) 、metastore和Driver(Complier、Optimizer和Executor),这些组件可以分为两大类:服务端组件和客户端组件。

  (1)客户端组件

    1、CLI:命令行接口,是最常用的一种用户接口,CLI启动时会同时启动一个Hive副本。CLI是和Hive交互的最简单也是最常用方式,只需要在一个具备完整Hive环境下的Shell终端中键入hive即可启动服务。 用户可以在CLI上输入HQL来执行创建表、更改属性以及查询等操作。不过Hive CLI不适应于高并发的生产环境,仅仅是Hive管理员的好工具。

    2、JDBC/ODBC: JDBC是java database connection的规范,它定义了一系列java访问各类db的访问接口,因此hive-jdbc其实本质上是扮演一个协议转换的角色,把jdbc的标准协议转换为访问HiveServer服务的协议。hive-jdbc除了扮演网络协议转化的工作,并不承担他的工作,比如sql的合法性校验和解析,一律忽略 。ODBC是一组对数据库访问的标准AP ,它的底层实现源码是采用C/C++编写的。JDBC/ODBC都是通过hiveclient与hiveserver保持通讯的,借助thrfit rpc协议来实现交互。

    3、HWI:HWI是Hive的web方为接口,提供了一种可以可以通过浏览器来访问Hive的服务。

  (2)服务端组件

    1、Thrift Server:Thrift是facebook开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,hive集成了Thrift Server服务,能让不同的编程语言调用hive的接口。

    2、元数据(Metastore):元数据服务组件,这个组件用于存储hive的元数据, 包括表名、表所属的数据库、表的拥有者、列/分区字段、表的类型、表的数据所在目录等内容。hive的元数据存储在关系数据库里,支持derby、mysql两种关系型数据库。元数据对于hive十分重要,因此hive支持把metastore服务独立出来,安装到远程的服务器集群里,从而解耦hive服务和metastore服务,保证hive运行的健壮性。

    3、Driver组件:该组件包括Interpreter、Complier、Optimizer和Executor,它的作用是将我们写的HiveQL(类SQL)语句进行解析、编译、优化,生成执行计划,然后调用底层的mapreduce计算框架。

      解释器:将SQL字符串转化为抽象语法树AST;

      编译器:将AST编译成逻辑执行计划;

      优化器:对逻辑执行计划进行优化;

      执行器:将逻辑执行计划转成可执行的物理计划,如MR/Spark

元数据存储模式


  Metastore的存储有两个部分,服务和存储,Hive的存储有三种部署模式,分别为内嵌模式、本地模式和远程模式。

             内嵌模式:这种模式也将单用户模式,它是Hive Metastore的最简单的部署方式,使用Hive内嵌的Derby数据库来存储元数据。但是Derby只能接受一个Hive会话的访问,试图启动第二个Hive会话就会导致Metastore连接失败。此模式连接到一个In-memory 的数据库Derby,一般用于Unit Test 。
             内嵌模式:这种模式也将单用户模式,它是Hive Metastore的最简单的部署方式,使用Hive内嵌的Derby数据库来存储元数据。但是Derby只能接受一个Hive会话的访问,试图启动第二个Hive会话就会导致Metastore连接失败。此模式连接到一个In-memory 的数据库Derby,一般用于Unit Test 。

    本地模式:本地模式也叫多用户模式,它是Metastore的默认模式(懒人专用模式),该模式下,单Hive会话(一个Hive 服务JVM)以组件方式调用Metastore和Driver。

    在hive-site.xml中设置MySQL的Connection URL、用户名和密码以及ConnectionDriverName;

    将MySQL的JDBC驱动Jar文件放到Hive的lib目录下。

hive.jdo.option.connectionURL="jdbc:mysql://{hostname}/{database name}?createDatabaseIfNotExist=true"

hive.jdo.option.ConnectionDriverName="com.mysql.jdbc.Driver"

hive.jdo.option.connectionUserName="{userName}"     

hive.jdo.option.connectionPassword="{userPassword}"



  远程模式:用于非Java客户端访问元数据库,在服务器端启动MetaStoreServer,客户端利用Thrift协议通过MetaStoreServer访问元数据库。 它将Metastore分离出来,成为一个独立的Hive服务(Metastore服务还可以部署多个)。这样的模式可以将数据库层完全置于防火墙后,客户就不再需要用户名和密码登录数据库,避免了认证信息的泄漏。

属性    默认值    描述

hive.metastore.local // false为远程模式
hive.metastore.uris // 远端模式下Metastore的URI列表
hive.jdo.option.connectionURL // metastore数据库的JDBC URL
hive.jdo.option.ConnectionDriverName // JDBC驱动名
hive.jdo.option.connectionUserName // JDBC用户名
hive.jdo.option.connectionPassword // JDBC密码


   总结 : 对于数据存储,Hive没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织Hive中的表,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。Hive中所有的数据都存储在HDFS中,存储结构主要包括数据库、文件、表和视图。
 

12-22 17:10