启动hive命令报错 “Metastore contains multiple versions”

错误日志:

 Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
      at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:444)
      at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:672)
      at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:616)
      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.util.RunJar.run(RunJar.java:221)
     at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
 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:1449)
     at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.<init>(RetryingMetaStoreClient.java:63)
     at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:73)
     at org.apache.hadoop.hive.ql.metadata.Hive.createMetaStoreClient(Hive.java:2661)
     at org.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:2680)
     at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:425)
     ... 8 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:1447)
     ... 13 more
 Caused by: MetaException(message:Metastore contains multiple versions)
     at org.apache.hadoop.hive.metastore.ObjectStore.getMSchemaVersion(ObjectStore.java:6643)
     at org.apache.hadoop.hive.metastore.ObjectStore.getMetaStoreSchemaVersion(ObjectStore.java:6605)
     at org.apache.hadoop.hive.metastore.ObjectStore.checkSchema(ObjectStore.java:6564)
     at org.apache.hadoop.hive.metastore.ObjectStore.verifySchema(ObjectStore.java:6552)
     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:98)
     at com.sun.proxy.$Proxy5.verifySchema(Unknown Source)
     at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.getMS(HiveMetaStore.java:539)
     at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.createDefaultDB(HiveMetaStore.java:587)
     at org.apache.hadoop.hive.metastore.HiveMetaStore$HMSHandler.init(HiveMetaStore.java:429)
     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:5554)
     at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.<init>(HiveMetaStoreClient.java:178)
     at org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient.<init>(SessionHiveMetaStoreClient.java:73)
     ... 18 more

解决方案:

因为hive metastore存储在mysql中,所以登录mysql,use hive所使用的DB,然后 查询下VERSION表
mysql> select * from VERSION;

+——–+—————-+——————+
| VER_ID | SCHEMA_VERSION | VERSION_COMMENT |
+——–+—————-+——————+
| 1 | 0.14.0 | Set by MetaStore |
| 2 | 0.14.0 | Set by MetaStore |
| 3 | 0.14.0 | Set by MetaStore |
| 4 | 0.14.0 | Set by MetaStore |
| 5 | 0.14.0 | Set by MetaStore |
| 6 | 0.14.0 | Set by MetaStore |
+——–+—————-+——————+

保留第一条记录,其他记录全部删除

 delete from VERSION where VER_ID !=1 

出现这类异常问题原因

hive 是不支持并发的,估计我同事 不小心启动多个hive,也可能是网络问题,反正很诡异

<think>我们正在处理一个关于在未安装Maven的Linux系统上启动Hive时出现多个SLF4J绑定的错误。用户遇到了以下错误信息: Class path contains multiple SLF4J bindings 根据引用[1]和引用[3]中的信息,错误是由于classpath中存在多个SLF4J绑定(即多个实现了SLF4J接口的日志框架绑定)导致的。具体地,引文中提到了两个绑定: 1. org.slf4j.impl.Log4jLoggerFactory (来自slf4j-log4j12) 2. 另一个来自log4j-slf4j-impl 在Hive环境中,通常推荐使用一个日志绑定。由于Hive本身依赖于Log4j,因此我们通常希望保留log4j-slf4j-impl(这是Log4j2的SLF4J绑定)或者slf4j-log4j12(这是Log4j1的SLF4J绑定)。但是,如果两者同时存在,就会产生冲突。 用户提到他是在未安装Maven的Linux系统上启动Hive,这意味着我们无法通过Maven来管理依赖。因此,我们需要手动解决依赖冲突。 解决方案: 1. 定位Hive的lib目录中引起冲突的jar包。 通常,Hive的lib目录(例如:/opt/hive/lib)包含所有运行时依赖。我们需要查找以下两个jar包(或类似版本): slf4j-log4j12-*.jar (这是Log4j1的SLF4J绑定) log4j-slf4j-impl-*.jar (这是Log4j2的SLF4J绑定) 2. 移除其中一个绑定。根据Hive的版本和日志框架的依赖,通常Hive较新版本(如3.x)使用Log4j2,因此应该保留log4j-slf4j-impl,而移除slf4j-log4j12。但是,如果Hive版本较旧(如1.x或2.x),则可能依赖于Log4j1,因此需要保留slf4j-log4j12,移除log4j-slf4j-impl。 3. 注意:在移除之前,最好先备份。 具体步骤: a. 进入Hive的lib目录: cd /opt/hive/lib (请根据实际安装路径调整) b. 查找冲突的jar包: ls slf4j-log4j12-*.jar log4j-slf4j-impl-*.jar c. 假设我们使用的是Hive较新版本(如3.x),则移除slf4j-log4j12的jar包: rm slf4j-log4j12-*.jar 或者,如果使用的是旧版本Hive(如1.x或2.x),则移除log4j-slf4j-impl的jar包: rm log4j-slf4j-impl-*.jar d. 重新启动Hive,检查错误是否消失。 另外,引用[2]提到了另一个问题(配置临时目录),但这个问题与当前错误无关。引用[4]是关于MySQL JDBC驱动程序的安装,也与当前问题无关。 但是,用户还提到了一个关于日志配置的警告: log4j:WARN No appenders could be found for logger log4j:WARN Please initialize the log4j system properly. 这个警告是因为Log4j没有找到配置文件。解决这个警告通常需要提供一个log4j的配置文件(如log4j.properties)并放在classpath中。但这个问题与多个绑定的错误是独立的。我们可以先解决绑定冲突,然后再解决日志配置问题。 因此,针对多个绑定的错误,我们的解决方案是移除多余的绑定jar包。 如果用户不确定该移除哪个,可以尝试先移除slf4j-log4j12(因为Hive新版本已经转向Log4j2)。如果移除后Hive无法启动或出现其他日志错误,则恢复该jar包并尝试移除log4j-slf4j-impl。 注意:在Hive的较新版本中,官方已经使用Log4j2,所以通常移除slf4j-log4j12是正确的。 相关问题: 1. 如何确定Hive使用的是Log4j1还是Log4j2? 2. 除了移除jar包,还有其他方法解决多个SLF4J绑定的问题吗? 3. 如何为Hive配置log4j的配置文件以解决No appenders警告?</think>### 解决 Hive 启动时 SLF4J 多绑定错误 在未安装 Maven 的 Linux 系统中启动 Hive 时遇到 `Class path contains multiple SLF4J bindings` 错误,主要原因是 Hive 的 classpath 中存在多个日志框架绑定冲突。以下是具体解决步骤: #### 📌 解决方案 1. **定位冲突的 JAR 包** 进入 Hive 的 lib 目录(通常为 `/opt/hive/lib`),执行: ```bash ls -l *slf4j*.jar *log4j*.jar ``` 重点关注以下两个冲突包: - `log4j-slf4j-impl-*.jar`(Log4j2 绑定) - `slf4j-log4j12-*.jar`(Log4j1 绑定) 2. **移除冗余绑定(二选一)** **方案 A(推荐保留 Log4j2)**: ```bash mv /opt/hive/lib/slf4j-log4j12-*.jar /tmp/ # 移走旧版 Log4j1 绑定 ``` **方案 B(保留 Log4j1)**: ```bash mv /opt/hive/lib/log4j-slf4j-impl-*.jar /tmp/ # 移走新版 Log4j2 绑定 ``` 3. **验证日志配置** 检查 `hive-log4j2.properties` 配置文件路径(通常为 `/opt/hive/conf/`),确保存在有效配置: ```bash ls /opt/hive/conf/*log4j* ``` 若缺失配置文件,需从模板复制: ```bash cp /opt/hive/conf/hive-log4j2.properties.template /opt/hive/conf/hive-log4j2.properties ``` 4. **修复临时目录权限(可选)** 若引用[2]中提到的临时目录问题同时存在,修改 `hive-site.xml`: ```xml <property> <name>hive.querylog.location</name> <value>/your/local/path/tmp</value> <!-- 替换为实际路径 --> </property> <property> <name>hive.server2.logging.operation.log.location</name> <value>/your/local/path/tmp</value> </property> ``` 5. **重启 Hive 服务** 完成上述操作后重启 Hive: ```bash hive --service metastore & # 启动元数据服务 hive # 启动 CLI ``` #### ⚠️ 注意事项 - 操作前**备份 JAR 包**,避免误删依赖。 - 若使用 Hive 3.x+ 版本,优先保留 `log4j-slf4j-impl`(Log4j2 绑定)[^3]。 - 检查 MySQL 驱动版本(引用[4]),需与 Hive 兼容,建议使用 `mysql-connector-java-5.1.49.jar`。 #### 🔍 原理说明 SLF4J 要求 classpath 中**只能有一个日志绑定实现**。Hive 默认包含 Log4j2 绑定,但旧版组件可能引入 Log4j1 绑定(如 `slf4j-log4j12`),导致冲突。移除多余绑定即可解决[^1]。 --- ### 相关问题 1. **如何区分 Log4j1 和 Log4j2 的绑定 JAR 包?** 2. **除了移除 JAR 包,还有哪些方法解决 SLF4J 多绑定冲突?** 3. **Hive 启动时出现 `No appenders could be found` 警告应如何修复?** 4. **如何验证 Hive 的日志系统已正确配置?**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值