Исключение в десериализации авро объекта в карте уменьшено
Я пытаюсь запустить задание уменьшения карты, которое принимает 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.