反序列化地图中的avro对象的例外减少

时间:2015-02-03 14:29:34

标签: apache hadoop parallel-processing mapreduce avro

我正在尝试运行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 个答案:

答案 0 :(得分:0)

此类错误的常见原因是:

  • 您的软件是针对1.7.6版本的avro编译的,但在运行时,可能会加载旧版本的类。
  • 确保1.7.6是运行时类路径中avro工件的实际版本。在mapper的开头打印出类路径。如果您正在使用oozie,则类路径jar将在启动器作业输出中列出。
  • 你在类路径中看到的第一个avro jar是用来加载类的那个,所以如果它不是1.7.6,那就是问题。
  • 您可以通过将mapreduce.job.user.classpath.first配置属性设置为true来强制您的类路径工件首先出现在任务的类路径中。

你的pom中还有另一个错误可能会导致你出现问题,也许就是你所看到的问题。您正在使用为hadoop2编译的avro-mapred工件,而您依赖的hadoop工件是hadoop1。这些不应该兼容。如果您正在使用hadoop1,请在avro-mapred上松开hadoop2分类器,如果您正在使用hadoop2,请删除hadoop-core并改为使用hadoop-mapreduce-client-core。

答案 1 :(得分:0)

我已经通过在引导操作中注入正确的Avro jar解决了这个问题,如下所述:

https://stackoverflow.com/a/40235289/3487888