Hadoop NoSuchMethodError apache.commons.cli

Posted

技术标签:

【中文标题】Hadoop NoSuchMethodError apache.commons.cli【英文标题】: 【发布时间】:2016-07-29 09:14:44 【问题描述】:

我正在使用hadoop-2.7.2,并使用 IntelliJ 进行了 MapReduceJob。在我的工作中,我使用 apache.commons.cli-1.3.1 并将 lib 放入 jar 中。

当我在我的 Hadoop 集群上使用 MapReduceJob 时,我有一个 NoSuchMethodError

线程“主”java.lang.NoSuchMethodError 中的异常: org.apache.commons.cli.Option.builder(Ljava/lang/String;)Lorg/apache/commons/cli/Option$Builder;

我不明白,因为该方法存在于Option 类中,而Option 类是从commons-cli.jar 提取到我的应用程序jar 中的。此外,我的其他库没有这个问题。

感谢您的宝贵时间。

【问题讨论】:

我刚刚发现hadoop使用commons-CLi 1.2。我认为这是我的问题的根源,但我不知道如何解决它。 您可以尝试在您的pom.xml 中从Hadoop 依赖项中排除commons-cli-1.2,然后Hadoop 将使用您的commons-cli-1.3.1。如果它导致任何错误,您最好在代码中使用1.2 我做了类似的事情,但我的老板不想这样,因为它不能解决问题。如果我们稍后在另一个库中遇到同样的问题,他不想再次解决这个问题。不过谢谢你的建议。 我通过更改在类路径中声明 jar 的顺序来修复它。请检查我的答案。 【参考方案1】:

我们能够使用maven class relocations 修复此错误。如果您使用 shade 插件来构建您的 jar,请在 pom.xml 的相应部分添加以下内容:

<!-- necessary to fix NoSuchMethodError: org.apache.commons.cli.Option.builder -->
                            <relocations>
                                <relocation>
                                    <pattern>org.apache.commons.cli</pattern>
                                    <shadedPattern>org.shaded.commons.cli</shadedPattern>
                                </relocation>
                            </relocations>

还需要在依赖项部分的顶部添加对 commons-cli v1.3+ 的显式引用,然后再任何可能具有对旧版本 commons-cli 的传递引用的依赖项。

【讨论】:

这个解决方案对我有用,谢谢【参考方案2】:

问题似乎与classloader 加载类的方式有关。因为static Builder classcommon-cli 1.4 中,而一些hadoop 依赖项仍然引用旧版本 - 问题出现了。

在我的情况下,通过将 jar 文件添加的顺序更改为负责在程序执行之前设置环境的 shell 脚本中的类路径来解决问题。早些时候,我将 jar 添加到类路径中,例如

CLASSPATH=<Hadoop Jars>:<Common CLI jar>:$CLASSPATH

改为

CLASSPATH=<Common CLI jar>:<Hadoop Jars>:$CLASSPATH

它解决了问题。

【讨论】:

【参考方案3】:

我们通过下一个 gradle 配置解决了这个问题:

 compile('org.apache.parquet:parquet-tools:1.9.0')
  exclude module:"commons-cli"
 

【讨论】:

以上是关于Hadoop NoSuchMethodError apache.commons.cli的主要内容,如果未能解决你的问题,请参考以下文章

Sqoop HBase 导入:java.lang.NoSuchMethodError:org.apache.hadoop.hbase.HTableDescriptor.addFamily

Hadoop-1,web页面调用报无hbase.jar包以解决 2,报java.lang.NoSuchMethodError: org.eclipse.jdt.internal.compiler.

Exception in thread “main“ java.lang.NoSuchMethodError: org.apache.hadoop.hbase.client.HBaseAdmin.

Hive启动报错:java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument

Apache Pig:Guice 创建错误。 java.lang.NoSuchMethodError

Hive初始化报错Exception in thread “main“ java.lang.NoSuchMethodError: com.google.common.base.Precondition