Hive中表和分区的所有元数据都存储在Hive的元存储(Metastore)中。元数据使用JPOX(Java Persistent Objects)对象关系映射解决方案进行持久化,所以任何被JPOX支持的存储都可以被Hive使用。大多数商业关系型数据库和许多开源的数据存储都被支持,所以就可以被Hive使用存储元数据。Hive支持三种不同的元存储服务器,分别为:内嵌式元存储、本地元存储、远程元存储,每种存储方式使用不同的配置参数,相关的配置参数如下表所示:
配置参数 | 描述 |
javax.jdo.option.ConnectionURL | 包含元数据的数据存储的JDBC连接字符串。默认值为jdbc:derby:;databaseName=metastore_db;create=true。 |
javax.jdo.option.ConnectionDriverName | 包含元数据的数据存储的JDBC驱动类名称。默认值为org.apache.derby.jdbc.EmbeddedDriver。 |
hive.metastore.uris | Hive连接到该URI请求远程元存储的元数据。默认值为空。 |
hive.metastore.local | 本地或者远程数据存储 (Hive-0.10已经不再使用该参数: 如果 |
hive.metastore.warehouse.dir | 本地表的默认位置,默认值为/user/hive/warehouse。 |
hive.metastore.metadb.dir | |
hive.metastore.rawstore.impl | 实现org.apache.hadoop.hive.metastore.rawstore接口的类,该类用于存储和检索行元数据对象,如表、数据库。 |
hive.metastore.ds.connection.url.hook | 提取JDO连接URL的钩子名称,若为空,则使用javax.jdo.option.ConnectionURL中的值。 |
hive.metastore.server.min.threads | Thrift服务器池中工作线程的最小数量,默认值为200。 |
hive.metastore.server.max.threads | Thrift 服务器池中工作线程的最大数量,默认值为10000。 |
hive.hmshandler.retry.attempts | 在JDO数据存储出现错误后尝试连接的次数默认值为1。 |
hive.hmshandler.retry.interval | 尝试间隔的毫秒数,默认值为1000。 |
前面提到Hive支持三种元存储方式,默认方式为内嵌式元存储。下面分别对三种存储方式如何配置进行学习。
内嵌式元存储
内嵌式元存储主要用于单元测试,在该模式下每次只有一个进程可以连接到元存储,Derby是内嵌式元存储的默认数据库。内嵌式元存储的配置如下:
配置参数 | 值 | 描述 |
javax.jdo.option.ConnectionURL | jdbc:derby:;databaseName=metastore_db;create=true | 包含元数据的数据存储的JDBC连接字符串。 |
javax.jdo.option.ConnectionDriverName | org.apache.derby.jdbc.EmbeddedDriver | JDBC驱动类。 |
hive.metastore.warehouse.dir | /user/hive/warehouse | 本地表的默认位置。 |
hive.metastore.uris | 空值 | 内嵌式也是本地模式,所以为空值。 |
本地元存储
在本地模式下,每个Hive客户端都会打开到数据存储的连接并在该连接上请求SQL查询。下表展示了如何在MySQL数据库服务器中建立元存储,确保在Hive查询被执行的机器上是可以访问该数据库服务器的,同时确保JDBC类库在Hive客户端的类路径中。
配置参数 | 值 | 描述 |
javax.jdo.option.ConnectionURL | jdbc:mysql://<host name>/<database name>?createDatabaseIfNotExist=true | 元数据存储在MySQL数据库中。 |
javax.jdo.option.ConnectionDriverName | com.mysql.jdbc.Driver | MySQL JDBC驱动类。 |
javax.jdo.option.ConnectionUserName | <user name> | 连接MySQL的用户名。 |
javax.jdo.option.ConnectionPassword | <password> | 连接MySQL的密码。 |
hive.metastore.uris | 空值 | 本地模式下为空值。 |
hive.metastore.warehouse.dir | /user/hive/warehouse | Hive表的默认位置。 |
远程元存储
在远程模式下,所有的Hive客户端都将打开一个到元数据服务器的连接,该服务器依次查询元数据。元数据服务器和客户端之间使用Thrift协议通信,从Hive-0.5.0开始,可以执行下面的命令启动Thrift服务器:
hive--service metastore
下面以MySQL为例,分别学习服务器端和客户端的配置,服务器端的配置如下表所示:
配置参数 | 值 | 描述 |
javax.jdo.option.ConnectionURL | jdbc:mysql://<host name>/<database name>?createDatabaseIfNotExist=true | 元数据存储在MySQL数据库中。 |
javax.jdo.option.ConnectionDriverName | com.mysql.jdbc.Driver | MySQL JDBC驱动类。 |
javax.jdo.option.ConnectionUserName | <user name> | 连接MySQL的用户名。 |
javax.jdo.option.ConnectionPassword | <password> | 连接MySQL的密码。 |
hive.metastore.warehouse.dir | /user/hive/warehouse | Hive表的默认位置。 |
客户端的配置为:
配置参数 | 值 | 描述 |
hive.metastore.uris | thrift://<host_name>:<port> | Thrift元存储服务器的主机和端口号。 |
hive.metastore.warehouse.dir | /user/hive/warehouse | Hive表的默认位置。 |
在启动客户端和元存储服务器之前需要将JDBC驱动类库放到$HIVE_HOME/lib目录下。
原文链接:http://blog.csdn.net/skywalker_only/article/details/26219619