2014-01-06 22 views
2

我使用Apache的緊縮和已得到的Avro一個神祕的錯誤消息:如何追蹤Avro「<init>()V」故障的來源?

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

[字節碼之間的差異可能重複。 ()V vs。 (Z)V](http://stackoverflow.com/questions/14721852/difference-between-byte-code-initv-vs-initzv) –

+0

我不認爲這是重複的。 – LordOfThePigs

回答

0

<init>()V引用0參數構造函數。似乎AvroKey類沒有這樣的構造函數。

當您的類路徑中存在不匹配的庫版本時,通常會發生這種情況。在這種情況下,類路徑上的Crunch版本很可能需要一個Avro版本,它具有無參數構造函數,但是您提供的版本沒有該構造函數。因此運行時NoSuchMethodError

1

<init>()V是不帶參數的構造函數的內部名稱。

該錯誤表示您正在使用的類org.apache.avro.mapred.AvroKey沒有無參數構造函數。

您可能正在使用與您編譯的Avro版本不同的Avro版本運行您的應用程序。如果是這種情況,請確保您使用相同的版本進行編譯和運行。

否則,找出您的代碼爲什麼要訪問不存在的構造函數。

0

要增加這方面的一些顏色:

的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)和包含一個空的構造函數。

所以它必須是我的類路徑上的org.apache.avro.mapred.AvroKey上的舊avro實現。