Как отследить происхождение сбоев "<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 где-то в моем пути к классам.

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