我正在尝试运行一个map reduce作业,它将avro文件作为输入并进行一些处理。我遵循了apache提供的示例程序
http://avro.apache.org/docs/1.7.6/mr.html
但我总是遇到这个例外
java.lang.Exception: java.lang.NoSuchMethodError: org.apache.avro.generic.GenericData.createDatumWriter(Lorg/apache/avro/Schema;)Lorg/apache/avro/io/DatumWriter;
at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522)
Caused by: java.lang.NoSuchMethodError: org.apache.avro.generic.GenericData.createDatumWriter(Lorg/apache/avro/Schema;)Lorg/apache/avro/io/DatumWriter;
你知道我做错了什么吗?我已经在底部指定了pom配置。我也在使用mapr版本4。
<repositories>
<repository>
<id>MapR</id>
<url>http://repository.mapr.com/maven/.</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>1.2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro</artifactId>
<version>1.7.6</version>
</dependency>
<dependency>
<groupId>org.apache.avro</groupId>
<artifactId>avro-mapred</artifactId>
<version>1.7.6</version>
<classifier>hadoop2</classifier>
</dependency>
</dependencies>
2条答案
按热度按时间e5nqia271#
此类错误的常见原因如下:
您的软件是根据1.7.6版本的avro编译的,但在运行时,可能会加载旧版本的类。
确保1.7.6是运行时类路径中avro工件的实际版本。在Map器的开头打印出类路径。如果您使用的是oozie,那么类路径jar将列在启动器作业输出中。
在类路径中看到的第一个avrojar将用于加载类,因此如果不是1.7.6,那就是问题所在。
您可以通过设置
mapreduce.job.user.classpath.first
将配置属性设置为true。另外,你的pom中还有另一个错误,很可能会导致你的问题,可能就是你看到的那些问题。您使用的是为hadoop2编译的avro mapred工件,而您所依赖的hadoop工件是hadoop1的工件。这些不应该兼容。如果您使用的是hadoop1,请在avro mapred上释放hadoop2分类器;如果您使用的是hadoop2,请移除hadoop核心,并将hadoop mapreduce客户机核心放在其中。
qnyhuwrf2#
我通过在引导操作中注入正确的avro jar解决了这个问题,如下所述:
https://stackoverflow.com/a/40235289/3487888