【发布时间】:2019-07-29 16:06:39
【问题描述】:
我正在尝试使用 Azure HDInsight 在 Hadoop 集群上运行 MapReduce 作业。在我的 .jar 中,我有以下依赖项(来自 mvn dependency:tree):
[INFO] +- org.apache.avro:avro:jar:1.8.1:compile
[INFO] +- org.apache.avro:avro-mapred:jar:hadoop1:1.8.1:compile
[INFO] | +- org.apache.avro:avro-ipc:jar:1.8.1:compile
当我编译 jar 并在我的机器上运行它时,一切正常。但是当我在 HDInsight 群集上运行它时,我收到以下错误:
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.avro.Schema$Parser.parse(Ljava/lang/String;[Ljava/lang/String;)Lorg/apache/avro/Schema;
at org.foo.bar.MyClass.<clinit>(MyClass.java:9)
at org.foo.bar.Sample.main(Sample.java:242)
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:243)
at org.apache.hadoop.util.RunJar.main(RunJar.java:158)
这是一个依赖版本冲突 - org.apache.avro.Schema$Parser.parse 仅在 avro 版本 1.7.5 中定义(根据 this question),所以它必须是集群上使用的包的不同版本。但我的印象是依赖项被打包在 jar 文件中,所以我很困惑为什么会这样。为什么会出现这种情况,我该如何解决(或至少进一步检查问题,例如通过 ssh 进入集群并检查其中的文件)?
这里是我的 pom.xml 的依赖项部分供参考:
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.8.1</version>
</dependency>
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro-mapred</artifactId>
<version>1.8.1</version>
<classifier>hadoop1</classifier>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-examples</artifactId>
<version>2.7.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-common</artifactId>
<version>2.7.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
【问题讨论】:
-
能不能用Avro 1.7.4版本试试看能否解决?
-
无法编译。
-
是的,我在我的问题中链接到了那个。不幸的是,我不能只升级集群上的 avro,因为我每天都会自动配置和删除集群。
-
你用什么将依赖项包含到 jar 中?如果你只是用例如构建一个普通的罐子。
clean install,将不包含依赖项。
标签: java maven hadoop mapreduce azure-hdinsight