反序列化map reduce中的avro对象时出现异常

kg7wmglp  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(558)

我正在尝试运行一个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>
e5nqia27

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客户机核心放在其中。

qnyhuwrf

qnyhuwrf2#

我通过在引导操作中注入正确的avro jar解决了这个问题,如下所述:
https://stackoverflow.com/a/40235289/3487888

相关问题