spark MetaException(message:Version information not found in metastore. )

本文记录了解决Spark结合Hive过程中出现的元数据访问失败的问题。通过调整hive-site.xml配置文件中的hive.metastore.schema.verification参数,从true更改为false,成功解决了启动时的版本一致性校验错误。

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

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

尝试将spark与hive结合起来。将相关配置完毕以后,启动spark-sql的过程中,出现了以下错误:

16/07/25 17:19:08 WARN metadata.Hive: Failed to access metastore. This class should not accessed in runtime.
org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
	at org.apache.hadoop.hive.ql.metadata.Hive.getAllDatabases(Hive.java:1236)
	at org.apache.hadoop.hive.ql.metadata.Hive.reloadFunctions(Hive.java:174)
	at org.apache.hadoop.hive.ql.metadata.Hive.<clinit>(Hive.java:166)
	at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:503)
	at org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver$.main(SparkSQLCLIDriver.scala:116)
	at org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver.main(SparkSQLCLIDriver.scala)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731)
	at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181)
	at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206)
	at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)
	at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
	at org.apache.hadoop.hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.java:1523)
	at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.<init>(RetryingMetaStoreClient.java:86)
	at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:132)
	at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:104)
	at org.apache.hadoop.hive.ql.metadata.Hive.createMetaStoreClient(Hive.java:3005)
	at org.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:3024)
	at org.apache.hadoop.hive.ql.metadata.Hive.getAllDatabases(Hive.java:1234)
	... 14 more
Caused by: java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
	at org.apache.hadoop.hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.java:1521)
	... 20 more
Caused by: MetaException(message:Version information not found in metastore. )
	at org.apache.hadoop.hive.metastore.ObjectStore.checkSchema(ObjectStore.java:6664)
	at org.apache.hadoop.hive.metastore.ObjectStore.verifySchema(ObjectStore.java:6645)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.apache.hadoop.hive.metastore.RawStoreProxy.invoke(RawStoreProxy.java:114)
	at com.sun.proxy.$Proxy12.verifySchema(Unknown Source)
	at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.getMS(HiveMetaStore.java:572)
	at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.createDefaultDB(HiveMetaStore.java:620)
	at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.init(HiveMetaStore.java:461)
	at org.apache.hadoop.hive.metastore.RetryingHMSHandler.<init>(RetryingHMSHandler.java:66)
	at org.apache.hadoop.hive.metastore.RetryingHMSHandler.getProxy(RetryingHMSHandler.java:72)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:5762)
	at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.<init>(HiveMetaStoreClient.java:199)
	at org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient.<init>(SessionHiveMetaStoreClient.java:74)
	... 25 more

这个问题折磨了本宝宝好久。根据错误信息来看,肯定是hive元数据相关的错误。而hive的元数据是存在mysql里的。到底问题在哪里勒?
网络上找了一大圈,最后定位到了问题:
在hive-site.xml里,有这么一个配置项:

<property>
        <name>hive.metastore.schema.verification</name>
        <value>true</value>
</property>

查了一下这个配置项的意义:
hive.metastore.schema.verification:强制metastore的schema一致性,开启的话会校验在metastore中存储的信息的版本和hive的jar包中的版本一致性,并且关闭自动schema迁移,用户必须手动的升级hive并且迁移schema,关闭的话只会在版本不一致时给出警告,默认是false不开启;

因为此配置项设置成为了true,所以可能存在jar包版本不一致问题。导致无法正常启动!
将value由true改为false以后,顺利启动spark-shell

最后总结一下经验:
越是高层应用,依赖底层与下游的组件就越多,配置项也越多越复杂,出错的概率自然也就大了很多。
遇到错误以后,快速定位问题很重要。一般错误信息的提示都很长,一定注意仔细看最后一个错误信息。因为往往最后一个错误信息是源头,从而导致后续一系列问题。最开始的时候我就是因为没有特别注意到最后一个错误而浪费了一些时间!

MetaException(message:Hive Schema version 3.1.0 does not match metastore's schema version 2.3.0 Metastore is not upgraded or corrupt) at org.apache.hadoop.hive.metastore.RetryingHMSHandler.<init>(RetryingHMSHandler.java:84) at org.apache.hadoop.hive.metastore.RetryingHMSHandler.getProxy(RetryingHMSHandler.java:93) at org.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:8672) at org.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:8667) at org.apache.hadoop.hive.metastore.HiveMetaStore.startMetaStore(HiveMetaStore.java:8937) at org.apache.hadoop.hive.metastore.HiveMetaStore.main(HiveMetaStore.java:8854) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.hadoop.util.RunJar.run(RunJar.java:318) at org.apache.hadoop.util.RunJar.main(RunJar.java:232) Caused by: MetaException(message:Hive Schema version 3.1.0 does not match metastore's schema version 2.3.0 Metastore is not upgraded or corrupt) at org.apache.hadoop.hive.metastore.ObjectStore.checkSchema(ObjectStore.java:9099) at org.apache.hadoop.hive.metastore.ObjectStore.verifySchema(ObjectStore.java:9063) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.hadoop.hive.metastore.RawStoreProxy.invoke(RawStoreProxy.java:97) at com.sun.proxy.$Proxy22.verifySchema(Unknown Source) at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.getMSForConf(HiveMetaStore.java:699) at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.getMS(HiveMet
03-24
<think>好的,我现在要解决用户遇到的Hive Schema版本不匹配的问题,具体是Hive Schema version 3.1.0和metastore的2.3.0不一致。用户提到可能元存储未升级或损坏,需要找到解决方法。 首先,我得回忆一下之前处理类似问题的经验。根据用户提供的引用内容,比如引用[1]到[5],常见的解决方法包括升级metastore的schema版本、关闭版本验证,或者修改数据库中的版本号。不过用户的情况是3.1.0和2.3.0的不匹配,可能涉及更高版本的Hive,所以需要确认步骤是否适用。 接下来,我需要考虑用户的环境。用户可能同时使用了Spark和Hive,导致版本冲突,如引用[3]中提到的情况。这时候需要确认Hive和Spark的版本是否兼容,或者是否在升级Hive后没有正确升级metastore。 然后,用户可能已经尝试过某些方法但未成功,比如修改hive-site.xml中的参数,或者手动更新数据库版本。现在需要更详细的步骤,比如如何正确执行升级命令,或者如何检查元存储是否损坏。 另外,用户的问题可能涉及到两种解决方法:一种是真正升级元数据存储到3.1.0,另一种是绕过版本检查,但这可能带来稳定性风险。需要根据用户的需求,比如生产环境还是测试环境,推荐合适的解决方案。 还要注意,用户提供的引用中提到修改MySQL中的版本号,比如引用[4],但直接修改数据库版本可能存在风险,需谨慎操作。正确的做法应该是使用Hive自带的升级工具,如schematool来执行升级。 最后,需要总结步骤,确保用户能够逐步操作,并提醒备份数据,避免数据丢失。同时,生成相关问题,帮助用户进一步理解可能遇到的其它问题,比如如何降级或如何预防此类问题。</think>### 逐步解决方案 #### 问题分析 Hive Schema版本不匹配错误(3.1.0 vs 2.3.0)表明以下两种可能性: 1. **元存储未升级**:Hive客户端版本(3.1.0)高于元存储版本(2.3.0),需执行元存储升级操作。 2. **元存储损坏或配置错误**:元存储数据库中的版本信息与实际Hive版本不一致,可能因手动修改或异常操作导致[^1][^3]。 --- ### 方法1:升级元存储Schema(推荐) **步骤1:停止Hive服务** ```bash # 停止Hive Metastore和HiveServer2 systemctl stop hive-metastore systemctl stop hive-server2 ``` **步骤2:执行Schema升级命令** 使用Hive自带的`schematool`工具升级元存储: ```bash # 根据元存储类型选择驱动(MySQL/PostgreSQL等) schematool -dbType mysql -upgradeSchemaFrom 2.3.0 ``` - 若从2.3.0升级到3.1.0,命令会自动应用增量升级脚本[^4]。 **步骤3:验证升级结果** ```bash schematool -dbType mysql -info ``` - 输出应为`Hive distribution version: 3.1.0`和`Metastore schema version: 3.1.0`。 --- ### 方法2:绕过版本验证(临时方案) **步骤1:修改`hive-site.xml`** 添加配置关闭版本检查: ```xml <property> <name>hive.metastore.schema.verification</name> <value>false</value> </property> ``` - 此方法跳过版本校验,但可能导致功能异常,仅限测试环境使用[^5]。 --- ### 方法3:手动修复元存储版本(风险较高) **步骤1:连接元存储数据库** ```sql mysql -u root -p USE hive; SELECT * FROM VERSION; -- 查看当前版本 ``` **步骤2:更新版本号(谨慎操作)** ```sql UPDATE VERSION SET SCHEMA_VERSION='3.1.0' WHERE VER_ID=1; ``` - 此操作需确保元存储实际已兼容目标版本,否则可能引发数据损坏。 --- ### 关键注意事项 1. **备份元存储数据库**:操作前通过`mysqldump`备份数据。 2. **版本兼容性**:Hive客户端、元存储和Spark的版本需一致,避免跨版本混用[^3]。 3. **升级顺序**:先升级元存储,再升级Hive客户端和Spark。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值