Как отследить происхождение сбоев "<init>() V" в Avro?
Я использую Apache Crunch и получил загадочное сообщение об ошибке от Avro:
java.lang.NoSuchMethodError: org.apache.avro.mapred.AvroKey: method <init>()V not found
at org.apache.crunch.types.avro.AvroKeyConverter.getWrapper(AvroKeyConverter.java:57)
at org.apache.crunch.types.avro.AvroKeyConverter.outputKey(AvroKeyConverter.java:36)
at org.apache.crunch.types.avro.AvroKeyConverter.outputKey(AvroKeyConverter.java:25)
at org.apache.crunch.impl.mr.emit.MultipleOutputEmitter.emit(MultipleOutputEmitter.java:41)
at org.apache.crunch.MapFn.process(MapFn.java:34)
at org.apache.crunch.impl.mr.run.RTNode.process(RTNode.java:99)
at org.apache.crunch.impl.mr.emit.IntermediateEmitter.emit(IntermediateEmitter.java:56)
at org.apache.crunch.MapFn.process(MapFn.java:34)
at org.apache.crunch.impl.mr.run.RTNode.process(RTNode.java:99)
at org.apache.crunch.impl.mr.emit.IntermediateEmitter.emit(IntermediateEmitter.java:56)
at org.apache.crunch.MapFn.process(MapFn.java:34)
at org.apache.crunch.impl.mr.run.RTNode.process(RTNode.java:99)
at org.apache.crunch.impl.mr.run.RTNode.process(RTNode.java:110)
at org.apache.crunch.impl.mr.run.CrunchMapper.map(CrunchMapper.java:60)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212)
Что означает ошибка " init()V "? В частности, я бы хотел исправить эту проблему и в кризисной ситуации - это происходит только при использовании опции конвейера Mapredce для работы, но я не вижу, чтобы это происходило с использованием MemPipeline.
3 ответа
<init>()V
является внутренним именем конструктора, который не принимает параметров.
Ошибка означает, что класс org.apache.avro.mapred.AvroKey
который вы используете, не имеет конструктора без аргументов.
Возможно, вы запускаете приложение с версией Avro, отличной от той, с которой вы его скомпилировали. Если это так, убедитесь, что вы используете ту же версию для компиляции и запуска.
В противном случае выясните, почему ваш код пытается получить доступ к несуществующему конструктору.
<init>()V
ссылается на конструктор с 0 параметрами. Похоже, у класса AvroKey такого конструктора нет.
Это часто происходит, когда у вас есть несовпадающие версии библиотек на вашем пути к классам. В этом случае вполне вероятно, что версия Crunch на вашем classpath ожидает версию Avro, которая имеет конструктор no-arg, но версия, которую вы предоставляете, не имеет этого конструктора. Отсюда время выполнения NoSuchMethodError
,
Чтобы добавить немного цвета на это:
Класс OLD AvroKey поддерживает только один, ОДИН конструктор аргументов.
/** The wrapper of keys for jobs configured with {@link AvroJob} . */
public class AvroKey<T> extends AvroWrapper<T> {
/** Wrap a key. */
public AvroKey(T datum) { super(datum); }
}
НОВЫЙ класс AvroKey (1.4) и выше содержит пустой конструктор.
Так что это должна быть старая реализация avro на моем org.apache.avro.mapred.AvroKey где-то в моем пути к классам.