Hive的meta 数据支持以下三种存储方式

本文介绍了Hive元数据的三种存储方式:使用Derby数据库、本机MySQL服务器及远端MySQL服务器。针对每种方式提供了详细的配置步骤,并讨论了它们各自的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试环境下Hive总出问题,metastore的配置有问题。抽了点时间,把Hive的meta数据几种存储方式都配置了下。Hive的meta 数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储。远端存储比较适合生产环境。Hive官方wiki详细介绍了这三种方式,链接为:Hive Metastore 。

一、使用derby数据库存储元数据。

这种方式是最简单的存储方式,只需要在hive-default.xml或hive-site.xml做如下配置便可。


< property >

< name >javax.jdo.option.ConnectionURL</ name >

< value >jdbc:derby:;databaseName=metastore_db;create=true</ value >

</ property >



< property >

< name >javax.jdo.option.ConnectionDriverName</ name >

< value >org.apache.derby.jdbc.EmbeddedDriver</ value >

</ property >



< property >

< name >hive.metastore.local</ name >

< value >true</ value >

</ property >



< property >

< name >hive.metastore.warehouse.dir</ name >

< value >/user/hive/warehouse</ value >

</ property >



< property >

< name >hive.metastore.warehouse.dir</ name >

< value >/user/hive/warehouse</ value >

</ property >


使用derby存储方式时,运行hive会在当前目录生成一个derby文件和一个metastore_db目录。这种存储方式的弊端是在同一个目录下同时只能有一个hive客户端能使用数据库,否则会提示如下错误(这是一个很常见的错误)。


hive> show tables;

FAILED:
Error in metadata: javax.jdo.JDOFatalDataStoreException: Failed to
start database 'metastore_db', see the next exception for details.

NestedThrowables:

java.sql.SQLException: Failed to start database 'metastore_db', see the next exception for details.

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask


二、使用本机mysql服务器存储元数据。这种存储方式需要在本地运行一个mysql服务器,并作如下配置(下面两种使用mysql的方式,需要将mysql的jar包拷贝到$HIVE_HOME/lib目录下)。


< property >

< name >hive.metastore.warehouse.dir</ name >

< value >/user/hive_remote/warehouse</ value >

</ property >



< property >

< name >hive.metastore.local</ name >

< value >true</ value >

</ property >



< property >

< name >javax.jdo.option.ConnectionURL</ name >

< value >jdbc:mysql://localhost/hive_remote?createDatabaseIfNotExist=true</ value >

</ property >



< property >

< name >javax.jdo.option.ConnectionDriverName</ name >

< value >com.mysql.jdbc.Driver</ value >

</ property >



< property >

< name >javax.jdo.option.ConnectionUserName</ name >

< value >root</ value >

</ property >



< property >

< name >javax.jdo.option.ConnectionPassword</ name >

< value >dandan</ value >

</ property >


三、使用远端mysql服务器存储元数据。这种存储方式需要在远端服务器运行一个mysql服务器,并且需要在Hive服务器启动meta服务。

1)Hive服务器端配置如下。

< property >

< name >hive.metastore.warehouse.dir</ name >

< value >/user/hive_remote/warehouse</ value >

</ property >



< name >javax.jdo.option.ConnectionURL</ name >

< value >jdbc:mysql://localhost/hive_remote?createDatabaseIfNotExist=true</ value >

</ property >



< property >

< name >javax.jdo.option.ConnectionDriverName</ name >

< value >com.mysql.jdbc.Driver</ value >

</ property >



< property >

< name >javax.jdo.option.ConnectionUserName</ name >

< value >root</ value >

</ property >



< property >

< name >javax.jdo.option.ConnectionPassword</ name >

< value >dandan</ value >

</ property >


2)Hive客户端配置如下。


< property >

< name >hive.metastore.warehouse.dir</ name >

< value >/user/hive_remote/warehouse</ value >

</ property >



< property >

< name >hive.metastore.local</ name >

< value >false</ value >

</ property >



< property >

< name >hive.metastore.uris</ name >

< value >thrift://localhost:9083</ value >

</ property >


3)服务进程启动如下,默认监听的端口是9083(Hive版本低于0.5的才这样启动)。


henshao@henshao-desktop:~/hive-0.3.99.1/conf$
$JAVA_HOME/bin/java -Xmx1024m
-Dlog4j.configuration=file://$HIVE_HOME/conf/hive-log4j.properties
-Djava.library.path=$HADOOP_HOME/lib/native/Linux-amd64-64/ -cp
$CLASSPATH:$HADOOP_HOME/hadoop-0.19.2-core.jar
org.apache.hadoop.hive.metastore.HiveMetaStore


这里配置classpath太麻烦了,要把hadoop和hive的jar包都加到classpath上,手动加容易导致依赖错误。我写了一个简单的脚本,把$HIVE_HOME/lib下的jar全部连起来,用冒号分隔开。脚本代码如下。


#!/bin/bash



CLASSPATH=.



for dir in $*

do

for file in ` ls $ dir `

do

CLASSPATH=$CLASSPATH:$ dir /$ file

done

done



echo $CLASSPATH


运行时,只需要输入”./generate_classpath.sh $HIVE_HOME/lib”便可。然后将生成的字符串贴到.bashrc中,赋给CLASSPATH变量。

hive启动时有一个选项”–config”可以指定包含启动客户端用的配置文件的目录,该目录下需要有hive-default.xml或hive-site.xml文件。


hive --config conf_dir


根据我的实践发现,其实第二种方法也可以将Hive的元数据保存到一台远端服务器上,只要配置好javax.jdo.option.ConnectionURL这个连接串就行。
### Hive Metastore 配置与连接问题 #### Hive Metastore 的基本概念 Hive Metastore 是用于存储表元数据的组件,这些元数据包括数据库名称、表名、列定义以及位置等信息。Metastore 可以运行在一个独立进程中,并可以配置为使用多种不同的持久化存储方案。 #### 配置文件设置 为了正确配置 Hive Metastore,在 `hive-site.xml` 文件中需要指定多个属性来确保其正常工作。例如: ```xml <configuration> <!-- 指定JDBC URL --> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost:3306/metastore?createDatabaseIfNotExist=true</value> </property> <!-- 数据库用户名 --> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <!-- 数据库密码 --> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>mypassword</value> </property> <!-- 其他必要的参数... --> <!-- 关闭通知事件轮询API的身份验证 --> <property> <name>hive.metastore.event.db.notification.api.auth</name> <value>false</value> </property> </configuration> ``` 上述代码展示了如何通过修改 `hive-site.xml` 来关闭通知事件轮询 API 身份验证[^4]。 #### 解决常见的连接失败错误 当遇到像 "Error starting HiveServer2" 或者 "MetaStore Connection Failure then Retry" 这样的错误消息时,通常意味着存在网络通信障碍或者是配置不当的问题。对于这类情况,建议检查以下几个方面: - **确认 MySQL 服务状态**:确保 MySQL 正常启动并监听预期端口。 - **防火墙规则**:核实是否有任何防火墙阻止了客户端到服务器之间的 TCP 流量。 - **依赖项版本兼容性**:保证所使用的 JDBC Driver 版本与目标 RDBMS 匹配良好。 - **日志记录级别调整**:适当提高日志详细程度以便更好地诊断潜在原因。 如果仍然无法解决问题,则可能需要进一步查看具体异常堆栈跟踪中的线索,甚至考虑调试应用程序本身或查阅官方文档获取更多帮助[^3]。 #### 处理初始化问题 有时会碰到由于 Metastore 数据库未被初始化而导致的一系列麻烦。此时可以通过执行特定命令来进行手动初始化操作;另外也可以尝试重新创建整个 schema 结构作为最后手段。需要注意的是,在采取行动前务必做好充分备份以防意外丢失重要资料[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值