一、Hive服务
Hive的shell环境只是hive命令提供的其中一项服务。我们可以在运行时使用--service选项指明要使用哪种服务。键入hive --service help可以获得可用服务列表。下面介绍一些最有用的服务:
cli:
Hive的命令行接口(shell环境)。这是默认的服务。
hiveserver2:
让Hive以提供Thrift服务的服务器形式运行,允许用不同语言编写的客户端进行访问。hiveserver2在支持认证和多用户并发方面比原始的hiveserver有很大改进。使用Thrift、JDBC和ODBC连接器的客户端需要运行Hive服务器来和Hive进行通信。通过设置hive.server2.thrift.port配置属性来指明服务器所监听的端口号(默认为10000)。
beeline
以嵌入方式工作的Hive命令行接口(类似于常规的CLI),或者使用JDBC连接到一个HiveServer2进程。
hwi
Hive的Web接口。在没有安装任何客户端软件的情况下,这个简单的Web接口可以代替CLI。另外,Hue是一个功能更全面的Hadoop Web接口,其中包括运行Hive查询和浏览Hive metastore的应用程序。
jar
与hadoop jar等价。这是运行类路径中同时包含Hadoop和Hive类Java应用程序的简便方法。
metastore
默认情况下,metastore和HIve服务运行在同一个进程里。使用这个服务,可以让metastore作为一个单独的(远程)进程运行。通过设置METASTORE_PORT环境变量(或者使用-p命令行选项)可以指定服务器监听的端口号(默认为9083)。
二、Hive客户端
如果以服务器方式运行Hive(hive --service hiveserver2),可以在应用程序中以不同机制连接到服务器。Hive客户端和服务之间的联系如下图所示:
Thrift客户端:
Hive服务器提供Thrift服务的运行,因此任何支持Thrift的编程语言都可与之交互。有些第三方项目还提供Python和Ruby客户端。
JDBC驱动:
Hive提供了Type4(纯Java)的JDBC驱动,定义在org.apache.hadoop.hive.jdbc.HiveDriver类中。在以jdbc:hive2://host:port/dbname形式配置JDBC URI以后,Java应用程序可以在指定的主机和端口连接到另一个进程中运行的Hive服务器。驱动使用Java的Thrif绑定来调用由Hive Thrift客户端实现的接口。
你可能还希望通过URI jdbc:hive2://,用JDBC内嵌模式来连接Hive。在这个模式下,Hive和发出调用的应用程序在同一个JVM中运行。这时不需要以独立服务器方式运行Hive,这是因为此时应用程序并不使用Thrift服务或Hive的Thrift客户端。
Beeline CLI使用JDBC驱动与Hive通信。
ODBC驱动
Hive的ODBC驱动允许支持ODBC协议的应用程序(比如商业情报软件)连接到Hive。Apache Hive的发布版本中没有ODBC驱动,不过有些厂商会提供一个免费版的ODBC驱动。(和JDBC驱动类似,ODBC驱动使用Thrift和Hive服务器进行通信。)
三、MetaStore
metastore是Hive元数据的集中存放地。metastore包括两部分:服务和后台数据的存储。metastore有三种配置方式:内嵌、本地、远程。
1、内嵌metastore配置
默认情况下,metastore服务和Hive服务运行在同一个JVM中,它包含一个内嵌的以本地磁盘作为存储的Derby数据库实例。这称为内嵌metastore配置(embedded metastore configuration)。
使用内嵌metastore是Hive入门最简单的方法。但是,每次只有一个内嵌Derby数据库可以访问某个磁盘上的数据库文件,这就意味着一次只能为每个metastore打开一个Hive会话。如果要试着启动第二个会话,在它试图连接metastore时,会得到错误信息。
2、本地metastore配置
如果要支持多会话(以及多用户),需要使用一个独立的数据库。这种配置称为本地metastore配置,因为metastore服务仍然和Hive服务运行在同一个进程中,但连接的却是在另一个进程中运行的数据库,在同一台机器上或在远程机器上。任何JDBC兼容的数据库都可以通过javax.jdo.option.*配置属性来供metastore使用。
重要的metastore配置属性:
属性名称 | 类型 | 默认值 | 描述 |
---|---|---|---|
hive.metastore.warehouse.dir | URI | /user/hive/warehouse | 相对于fs.default.name的目录,托管表就存储在这里 |
hive.metastore.uris | 逗号分隔的URI | 未设定 | 如果未设置(默认值),则使用当前的metastore,否则连接到URI列表指定要连接的远程metastore服务器。如果有多个远程服务器,则客户端便以轮询(round robin)方式连接 |
javax.jdo.option.ConnectionURL | URL | jdbc:derby:;database Name=metastored b;create=true | metastore数据库的JDBC URL |
javax.jdo.option.ConnectionDriverName | 字符串 | org.apache.derby.jdbc.EmbeddedDriver | JDBC驱动器的类名 |
javax.jdo.option.ConnectionUserName | 字符串 | APP | JDBC用户名 |
javax.jdo.option.ConnectionPassword | 字符串 | mine | JDBC密码 |
对于独立的metastore,MySQL是一种很受欢迎的选择。此时javax.jdo.option.ConnectionURL应该设为jdbc:mysql://host/dbname?createDatabaseIfNotExist=true,而javax.jdo.option.ConnectionDriverName则设为com.mysql.jdbc.Driver。当然,还需要设置用户名和密码。MySQL的JDBC驱动的JAR文件(Connector/J)必须在Hive的类路径中,把这个文件放入Hive的lib目录即可。
3、远程metastore配置
在这种配置下,一个或多个metastore服务器和Hive服务运行在不同的进程内。这样一来,数据库层可以完全置于防火墙后,客户端则不需要数据库凭据(用户名和密码)从而提供了更好的可管理性和安全。
可以通过吧hive.metastore.uris设为metastore服务器URI(如果有多个服务器,各个URI之间用逗号分隔),把Hive服务设为使用远程metastore。metastore服务器URI的形式为thrift://host:port。这里,端口号对应于启动metastore服务器时所设定的METASTORE_PORT值。
完毕。