【问题标题】:Exception in deserializing avro object in map reduce在 map reduce 中反序列化 avro 对象时出现异常
【发布时间】:2015-02-03 14:29:34
【问题描述】:

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

【问题讨论】:

    标签: apache hadoop parallel-processing mapreduce avro


    【解决方案1】:

    此类错误的常见原因是:

    • 您的软件是针对 1.7.6 版本的 avro 编译的,但在运行时,可能会加载旧版本的类。
    • 确保 1.7.6 是运行时类路径中 avro 工件的实际版本。在映射器开始时打印出类路径。如果您使用的是 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。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-12-09
        • 2020-07-06
        • 2019-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多