我正在使用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发生。
答案 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实现。