Исключение в десериализации авро объекта в карте уменьшено

Я пытаюсь запустить задание уменьшения карты, которое принимает 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;

Есть идеи, что я могу делать не так? Я указал свои конфиги пом внизу. Также я использую 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 ответа

Я решил это, введя правильный Avro jar в действие начальной загрузки, как описано здесь:

/questions/20415672/oshibka-avro-na-aws-emr/20415683#20415683

Общая причина таких ошибок заключается в следующем:

  • Ваше программное обеспечение было скомпилировано с версией 1.7.6 avro, но во время выполнения, вероятно, загружались классы из более старой версии.
  • Убедитесь, что 1.7.6 является актуальной версией ваших avro-артефактов в вашем пути к классам во время выполнения. Распечатайте classpath в начале вашего картографа. Если вы используете oozie, файлы jar classpath перечислены в выводе задания запуска.
  • Первый avro jar, который вы видите в classpath, будет использоваться для загрузки классов, поэтому, если это не 1.7.6, это проблема.
  • Вы можете заставить свои артефакты classpath стоять первыми в classpath задачи, установив mapreduce.job.user.classpath.first свойство конфигурации в true.

Также у вас есть другая ошибка в вашей помпе, которая может очень хорошо вызвать у вас проблемы, возможно, те, которые вы видите. Вы используете avro-mapred артефакт, скомпилированный для hadoop2, в то время как артефакт hadoop, от которого вы зависите, - это hasad1. Они не должны быть совместимы. Если вы используете hadoop1, потеряйте классификатор hadoop2 на avro-mapred, а если вы используете hadoop2, удалите hadoop-core и вместо него поместите hadoop-mapreduce-client-core.

Другие вопросы по тегам