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 class
在common-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