2012-07-12 12 views
24

コマンドプロンプトからHadoop .jarファイルを実行しているときに、そのようなメソッドStockKeyメソッドがないと例外がスローされます。このようなメソッドはありません。Hadoop <init>

StockKeyは自分のタイプのキー用に定義された私のカスタムクラスです。ここで

は例外です:

12/07/12 00:18:47 INFO mapred.JobClient: Task Id : 
attempt_201207082224_0007_m_000000_1, Status : FAILED 

java.lang.RuntimeException: java.lang.NoSuchMethodException: SecondarySort$StockKey.  
<init>() 
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:115) 
    at org.apache.hadoop.io.WritableComparator.newKey(WritableComparator.java:109) 
    at org.apache.hadoop.io.WritableComparator.<init>(WritableComparator.java:95) 
    at org.apache.hadoop.io.WritableComparator.get(WritableComparator.java:51) 
    at org.apache.hadoop.mapred.JobConf.getOutputKeyComparator(JobConf.java:795) 
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:817) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:383) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:325) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:270) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:396) 
    at  
    org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1127) 
    at org.apache.hadoop.mapred.Child.main(Child.java:264) 
+1

** **このようなメソッドはありませんStockKeyメソッド "*。 **本物の**例外メッセージと完全なスタックトレースを切り取り、貼り付けてください。 –

+0

ここで編集しました。ありがとう。あなたはそれを見ていただけますか? –

+1

私のような将来の読者には、WritableComparableの実装を内部クラスにすることを警告したいと思います(私の場合は、マッパーの内部クラスでした)。上記と同じ例外があります。私はそれを自分自身のクラスに移したとき、それはうまくいった –

答えて

46

あなたのキークラスで空のデフォルトコンストラクタを提供する必要があります。 Hadoopはリフレクションを使用しており、フィードするパラメータを推測することはできません。

public StockKey(){} 
+1

内部のデフォルトの 'Writable'sで' Writable'と 'WritableComparable'を実装するときにもこの問題がありました - あなたはデフォルトのコンストラクタを提供するだけでなく、デフォルトのコンストラクタは他の 'Writable'インスタンス変数もインスタンス化する必要があります。さもなければSpillErrorが得られます。 – bbengfort

62

クラスがある場合など

writables、マッパー、レデューサー、あるクラスのために、このようなエラーを取得するときにチェックするために別のものがあります:

だからデフォルトコンストラクタを追加内部クラスの場合は、staticと宣言されていることを確認してください(つまり、そのクラスのインスタンスは必要ありません)。それ以外の場合、Hadoopは内部クラスをインスタンス化できず、この同じエラーが発生します。つまり、ゼロ引数のコンストラクタが必要です。

+3

あなたはちょうどスリングから私のお尻を持っています。静的な内部クラスについての説明をありがとう! –

+1

私は内部クラスが静的で囲まれたクラスの外側でインスタンス化する必要があることを知らなかったので、これは私に非常に多くの時間と欲求不満をもたらしました。 – DragonDTG

1

For scala tooは、私はすべての答えは私を助け

class IntPair (first : IntWritable, second : IntWritable) extends WritableComparable[IntPair] { 

    def this() = this(first = new IntWritable(), second = new IntWritable()) 

    def getFirst() : IntWritable = { 
     first 
    } 

    def getSecond() : IntWritable = { 
     second 
    } 

} 
0

、以下のようにデフォルトコンストラクタを追加する問題を修正しました。

私のケースでは、私が誤ってまたは急いでコンストラクタの可視性を減らしたときに起こった。

など。親コンストラクタはpublicであり、継承されたクラスのものです。デフォルトはprotectedまたはprotectedです。

0

この同じ問題が発生しました。 @Thomasと@Chrisのポインタに続いて修正されました。

これらの解決策は、問題を解決するために必要とされ、両方のように見える:@Thomasから

  • 回答は、Hadoopのは、リフレクションを使用し、大規模なプロジェクトをビルドするときにされたとして必要とされます。

  • 内部クラスを使用し、main()からマッパー/リデューサーを呼び出す場合、@Chrisからの回答が必要です。

0

デフォルトのコンストラクタがあることを確認してください。また、staticキーワードをクラス宣言に追加する必要がありました。つまり、

public class SecondarySort { 
    public static void main(String[] args) {...} 

    public static class StockKey extends ... {} 
} 
関連する問題