Hadoop教程

运行Hive

这一节我们将介绍运行Hive的一些更实用的技术,包括如何设置Hive使其能运行 在Hadoop集群上,并使用共享的metastore。为此,我们会介绍Hive体系结构的 一些细节。

配置Hive

Hive使用和Hadoop类似的XML配置文件进行设置。配置文件为hivesite.xml,它 在Hive的conf目录下。通过这个文件,可以设置每次运行Hive时希望Hive使用 的选项。这个目录下还包括hive-default.xml,其中记录Hive使用的选项和默 认值。

可以通过传递-Config选项参数给hive命令以重新定义Hive查找hive-site.xml文 件的目录:

% hive --config /Users/tom/dev/hive-conf

注意,这个选项指定包含配置文件的目录,而不是配置文件hive-site.xml本身。这 对于有(对应于多个集群的)多个站点文件时很有用。可以方便地在这些站点文件之 间进行切换。还有另一种方法,可以设置HIVE_CONF_DIR环境变量来指定配置文 件目录,效果一样。

Hive-site.xml最适合存放详细的集群连接信息:可以使用Hadoop属性 fs.default.name和mapred.job.tracker来指定文件系统和jobtracker关于配 置Hadoop的详细信息。如果没有设定这两个参数,它们就像在 Hadoop中一样,被设为默认值,即使用本地文件系统和本地(正在运行的)“作业运行器” (Job runner)——这对于试着用Hive来处理测试数据集非常方便。metastore的配置选项一般也能在hive-site.xml中找到。

Hive还允许你向hive 命令传递-hiveconf选项来为单个会话(session)设置属性。 例如,下面的命令设定在会话中使用一个(伪分布)集群:

% hive -hiveconf fs.default.name=localhost -hiveconf mapred.job.tracker=localhost: 8021

还可以在一个会话中使用SET命令更改设置„这对于为某个特定的査询修改Hive 或MapReduce作业设置非常有用。例如,以下命令确保表的定义中都使用“桶”(bucket)。

hive> SET hive.enforce.bucketing=true;

可以用只带属性名的SET命令查看任何属性的当前值:

hive> SET hive.enforce.bucketing;hive.enforce.bucketing=true

不带参数的SET命令会列出Hive所设置的所有属性(及其值)。注意,这个列表中 不包含Hadoop的默认值,除非这个值用本节中介绍的某个方法重写了。使用SET-v可以列出系统中的所有属性,包括Hadoop的默认值。

设置属性有一个优先级层次。在下面的列表中,越小的值表示优先级越髙:

1.Hive SET命令

2.命令行-hiveconf选项

3.hive-site.xml

4.hive-default.xml

hadoop-site.xml(或等价的 core-site.xml、hdfs-site.xml 与 mapred-site.xml)

hadoop-default.xml(或等价的core-defaulL.xml、hdfs-default,xml 以及 mapreddefault.xml)

曰志

日志的配置存放在conf/hive-log4j.properties中。可以通过编辑这个文件来修改曰 志的级别和其他日志相关设置。但是,更方便的办法是在会话中对日志配置进行设 置。例如,下面的语句可以方便地将调试消息发送到控制台:

% hive -hiveconf hive.root.logger=DEBUG,console

Hive服务

Hive外壳环境是可以使用hive命令来运行的一项服务。可以在运行时使用- service选项指明要使用哪种服务。键入hive-servicehelp可以获得可用服务 列表。下面介绍最有用的一些服务。

cli

Hive的命令行接口(外壳环境)。这是默认的服务。 hiveserver

hiveserver

让Hive以提供Trift服务的服务器形式运行,允许用不同语言编写的客户端进 行访问。使用Thrift、JDBC和ODBC连接器的客户端需要运行出^服务器来 和出代进行通信。通过设置HIVE_PORT环境变量来指明服务器所监听的端口 号(默认为10 000)。

hwi

Hive的Web接口。

jar

与hadoopjar等价的Hive的接口。这是运行类路径中同时包含Hadoop和 Hive类的Java应用程序的简便方法。

metastore

默认情况下,metastore和Hive服务运行在同一个进程里。使用这个服务,可 以让metastore作为一个单独的(远程)进程运行。通过设置METASTORE_PORT 环境变量可以指定服务器监听的端口号。

Hive Web interface(HWI)

你可能希望用Hive简洁的Web接口代替外壳环境。使用下面的命令启动这一 服务:

% export ANT_LIB=/path/to/ant/lib
% hive --service hwi

如果在系统的/opt/ant/lib中没有找到Ant的库,设定ANT_LIB环境变量即 可。然后在浏览器里浏览http://localhost:9999/hwi。从这里,可以查看Hive数 据库的模式,并创建会话来发出命令和查询。

我们还可以以共享服务方式运行Web接口。这样一来,同一个组织内的用 户不需要安装任何客户端软件也能访问。

Hive客户端

如果以服务器方式运行Hive(hive-servicehiveserver),可以在应用程序中以不 同机制连接到服务器。Hive客户端和服务之间的联系如图12-1所示。

图12-1.Hive体系结构

Thrift客户端

Hive Thrift客户端简化了在多种编程语言中运行Hive命令。Hive的Thrift绑 定支持 C++、Java、PHP、Python 和 Ruby。在 Hive 发布版本的 srdser- vice/src子目录下可以找到对这些语言的Thrift绑定。

JDBC驱动

ive 提供了(Type4)(纯java)的 JDBC 驱动,定义在 org.apache.hadoop. hive.jdbc.HiveDriver 类中。

ODBC驱动

Hive的ODBC驱动允许支持ODBC协议的应用程序连接到Hive。和JDBC驱 动类似,ODBC驱动使用Thrift和Hive服务器进行通信。ODBC驱动也还处 在开发阶段。

metastore

metastore是Hive元数据的集中存放地。metastore包括两部分:服务和后台数据的 存储。默认情况下,metastore服务和Hive服务运行在同一个JVM中,它包含一 个内嵌的以本地磁盘作为存储的Derby数据库实例。这称为“内嵌metastore配 置” (embedded metastore configuration),参见图 12-2。

使用内嵌metastore是Hive入门最简单的方法。但是,只使用一个内嵌口66>^数据 库每次只能访问一个磁盘上的数据库文件,这也就意味着你一次只能为每个 metastore打开一个Hive会话。如果要试着启动第二个会话,在它试图连接metastore时,会得到以下错误信息:

Failed to start database 'metastore_db'

图 12-2. Metastore 的配置

如果要支持多会话(以及多用户),需要使用一个独立的数据库。这种配置称“本地 metastore”,因为metastore服务仍然和Hive服务运行在同一个进程中,但连接的 却是在另一个进程中运行的数据库,在同一台机器上或在远程机器上。任何JDBC 兼容的数据库都可以通过设置表12-1列出的javax,jdo.option. *配置属性来供metastore使用。

MySQL是一种很受欢迎的独立metastore的选择。在这里, javax,jdo.option.ConnectionURL 设为 jdbc:mysql://host/dbname? createDatabaseIf Not Exist = true , 而 javax.jdo.option .ConnectionDriverName则设为com.mysql.jdbc.Dirver。当然,还需要设置用 户名和密码。MySQL的JDBC驱动的JAR文件(Connector/J)必须在Hive的类路径 中。把这个文件放入Hive的lib目录即可。

更进一步,还有一种metastore配置称为“远程metastore”。在这种配置下,一 个或多个metastore服务器和Hive服务运行在不同的进程内。因为这样一来, 数据库层可以完全置于防火墙后,客户端则不需要数据库凭证(用户名和密码), 从而提供更好的可管理性和安全。

可以通过把 hive.metastore.local 设为 false, hive.metastore.uris 设为metastore服务器URI(如果有多个服务器,各个URI幻之间用逗号分隔),来把Hive 服务设为使用远程metastore。metastore服务器URI的形式为thrift://host:port。 这里,端口号对应于启动metastore服务器时所设定的METASTORE_PORT值。

表12-1.重要的metastore配置属性

属性名称 类型 默认值 描述
hive.metastore.
warehouse.dir
URI /user/hive/warehouse 相对于fs.default.name的目 录,托管表就存储在这里
hive.metastore.local 布尔型 true 是使用内嵌的metastore(true)。还 是连接到远程(false)。如果是 false ,则必须设置hive. metastore.uris
hive.metastore.uris 逗号分隔的URI 未设定 指定要连接的远程metastore服 务器的URI。如果有多个远程服 务器,客户端便以轮询(round robin)方式连接
javax.jdo.option. ConnectionURL URI jdbc:derby:;database
Name=metastored b;
create=true
metastore 数据库的 JDBC URL
javax.jdo.option.
ConnectionDriverName
字符串 rg.apache.derby.
jdbc.EmbeddedDriver
JDBC驱动器的类名
javax.jdo.option.
ConnectionUserName
字符串 APP JDBC用户名
javax.jdo.option.
ConnectionPassword
字符串 mine JDBC密码

关注微信获取最新动态