在初始化中遇到的问题:
[root@master data]# schematool -dbType derby -initSchema
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/data/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/data/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)Vat org.apache.hadoop.conf.Configuration.set(Configuration.java:1357)at org.apache.hadoop.conf.Configuration.set(Configuration.java:1338)at org.apache.hadoop.mapred.JobConf.setJar(JobConf.java:518)at org.apache.hadoop.mapred.JobConf.setJarByClass(JobConf.java:536)at org.apache.hadoop.mapred.JobConf.<init>(JobConf.java:430)at org.apache.hadoop.hive.conf.HiveConf.initialize(HiveConf.java:5141)at org.apache.hadoop.hive.conf.HiveConf.<init>(HiveConf.java:5104)at org.apache.hive.beeline.HiveSchemaTool.<init>(HiveSchemaTool.java:96)at org.apache.hive.beeline.HiveSchemaTool.main(HiveSchemaTool.java:1473)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)
来自DeepSeek的解决方案:(已经成功解决)
从错误信息来看,执行 schematool -dbType derby -initSchema
时出现了两个问题:
-
SLF4J 绑定冲突:
在类路径中发现了多个 SLF4J 绑定(log4j-slf4j-impl-2.10.0.jar
和slf4j-log4j12-1.7.25.jar
)。
解决方法:
删除其中一个冲突的 JAR 包。例如:rm /data/hive/lib/log4j-slf4j-impl-2.10.0.jar
或者:
rm /data/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar
-
Guava 版本不兼容:
错误java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument
表明 Hive 和 Hadoop 使用的 Guava 库版本不兼容。
解决方法:
确保 Hive 和 Hadoop 使用相同版本的 Guava 库。以下是具体步骤:- 检查 Hadoop 的 Guava 版本:
例如,输出可能是ls /data/hadoop/share/hadoop/common/lib/guava-*.jar
guava-27.0-jre.jar
。 - 检查 Hive 的 Guava 版本:
例如,输出可能是ls /data/hive/lib/guava-*.jar
guava-19.0.jar
。 - 将 Hive 的 Guava 版本替换为与 Hadoop 一致的版本:
rm /data/hive/lib/guava-19.0.jar cp /data/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /data/hive/lib/
- 检查 Hadoop 的 Guava 版本:
完整解决步骤
- 删除 SLF4J 冲突的 JAR 包:
rm /data/hive/lib/log4j-slf4j-impl-2.10.0.jar
- 替换 Hive 的 Guava 版本为与 Hadoop 一致的版本:
rm /data/hive/lib/guava-*.jar cp /data/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /data/hive/lib/
- 重新执行初始化命令:
schematool -dbType derby -initSchema
验证是否成功
如果成功,您将看到类似以下输出:
Metastore connection URL: jdbc:derby:;databaseName=metastore_db;create=true
Metastore Connection Driver : org.apache.derby.jdbc.EmbeddedDriver
Metastore connection User: APP
Starting metastore schema initialization to 3.1.0
Initialization script hive-schema-3.1.0.derby.sql
Initialization completed successfully
SchemaTool completed
注意事项
- 备份文件:在删除或替换 JAR 包前,建议备份相关文件。
- 权限问题:确保操作时有足够的权限(使用
root
用户或sudo
)。 - 生产环境:生产环境中建议使用 MySQL 或 PostgreSQL 作为元数据库,而不是 Derby。