如何在Avro中跟踪“<init>()V”故障的来源?</init>

时间:2014-01-06 14:15:34

标签: java reflection avro methodnotfound apache-crunch

我正在使用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 个答案:

答案 0 :(得分:2)

<init>()V是不带参数的构造函数的内部名称。

错误意味着您使用的类org.apache.avro.mapred.AvroKey没有no-args构造函数。

您可能正在运行Avro版本的应用程序,该版本与您编译的版本不同。如果是这种情况,请确保使用相同的版本进行编译和运行。

否则,找出您的代码试图访问不存在的构造函数的原因。

答案 1 :(得分:0)

<init>()V指的是0参数构造函数。似乎AvroKey类没有这样的构造函数。

当您在类路径上存在不匹配的库版本时,通常会发生这种情况。在这种情况下,类路径上的Crunch版本可能需要具有no-arg构造函数的Avro版本,但是您提供的版本没有该构造函数。因此运行时NoSuchMethodError

答案 2 :(得分:0)

为此添加一些颜色:

OLD AvroKey类仅支持单个ONE参数构造函数。

/** 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)及以上版本包含一个空构造函数。

所以它必须是我的类路径上的org.apache.avro.mapred.AvroKey上的旧avro实现。