2

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

4

3 回答 3

2

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

该错误意味着org.apache.avro.mapred.AvroKey您正在使用的类没有无参数构造函数。

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

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

于 2014-01-06T14:20:33.260 回答
0

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

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

于 2014-01-06T14:19:02.507 回答
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 实现。

于 2014-01-06T14:29:53.333 回答