java.lang.NoSuchMethodError: org.apache.hive.common.util.ShutdownHookManager.addShutdownHook

java.lang.NoSuchMethodError: org.apache.hive.common.util.ShutdownHookManager.addShutdownHook

我正在尝试使用 Spark 作为引擎类型在 Kylin 上构建一个立方体。该集群包含以下工具:

OS 图片:1.0-debian9

Apache Spark 2.4.4(从 1.6.2 更改)

Apache Hadoop 2.7.4

Apache 配置单元 1.2.1

我在构建多维数据集时遇到此错误:

java.lang.NoSuchMethodError: org.apache.hive.common.util.ShutdownHookManager.addShutdownHook(Ljava/lang/Runnable;)V
    at org.apache.hive.hcatalog.common.HiveClientCache.createShutdownHook(HiveClientCache.java:221)
    at org.apache.hive.hcatalog.common.HiveClientCache.<init>(HiveClientCache.java:153)
    at org.apache.hive.hcatalog.common.HiveClientCache.<init>(HiveClientCache.java:97)
    at org.apache.hive.hcatalog.common.HCatUtil.getHiveMetastoreClient(HCatUtil.java:553)
    at org.apache.hive.hcatalog.mapreduce.InitializeInput.getInputJobInfo(InitializeInput.java:104)
    at org.apache.hive.hcatalog.mapreduce.InitializeInput.setInput(InitializeInput.java:88)
    at org.apache.hive.hcatalog.mapreduce.HCatInputFormat.setInput(HCatInputFormat.java:95)
    at org.apache.hive.hcatalog.mapreduce.HCatInputFormat.setInput(HCatInputFormat.java:51)
    at org.apache.kylin.source.hive.HiveMRInput$HiveTableInputFormat.configureJob(HiveMRInput.java:80)
    at org.apache.kylin.engine.mr.steps.FactDistinctColumnsJob.setupMapper(FactDistinctColumnsJob.java:126)
    at org.apache.kylin.engine.mr.steps.FactDistinctColumnsJob.run(FactDistinctColumnsJob.java:104)
    at org.apache.kylin.engine.mr.common.MapReduceExecutable.doWork(MapReduceExecutable.java:131)
    at org.apache.kylin.job.execution.AbstractExecutable.execute(AbstractExecutable.java:167)
    at org.apache.kylin.job.execution.DefaultChainedExecutable.doWork(DefaultChainedExecutable.java:71)
    at org.apache.kylin.job.execution.AbstractExecutable.execute(AbstractExecutable.java:167)
    at org.apache.kylin.job.impl.threadpool.DefaultScheduler$JobRunner.run(DefaultScheduler.java:114)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

我检查了 hive 和 hadoop 库的 jar 目录,看是否有多余的 jar,我发现每种 jar 都有两个版本。例如:hive-common-1.2.1.jar 和 hive-common.jar.

我尝试将它们中的任何一个移动到不同的位置并尝试恢复立方体构建过程。但我得到了同样的错误。对此的任何帮助将不胜感激。

Dataproc 不支持此用例,如果您需要使用 Spark 2.4.4,则应使用 Dataproc 1.4 or 1.5 而不是 Spark 1.6.2 附带的 Dataproc 1.0。

除此之外,ShutdownHookManager.addShutdownHook(Ljava/lang/Runnable;)V方法是added in Hive 2.3.0,但是Spark使用Hive 1.2.1的fork,这就是为什么你需要使用支持Hive 1.2.1的Kylin版本。

关于重复的 jar,版本 less hive-common.jar 不是重复的,它是版本 hive-common-1.2.1.jar 的符号 link。您可以通过列出来验证这一点:

$ ls -al /usr/lib/hive/lib/hive-common.jar
lrwxrwxrwx 1 root root 21 Nov  9 09:20 /usr/lib/hive/lib/hive-common.jar -> hive-common-2.3.6.jar

我将 Hive 版本更改为 2.1.0,它对我有用。我决定通过检查 Kylin download 页面安装此版本的 Hive,然后依次通过其他云平台,如 AWS EMR 和 Microsoft Azure HDInsight for Kylin 2.6.4 版本。

感谢@Igor Dvorzhak 提出的宝贵建议。