web-dev-qa-db-ja.com

そのようなメソッド例外はありませんHadoop <init>

コマンドプロンプトからHadoop .jarファイルを実行すると、そのようなメソッドStockKeyメソッドがないことを示す例外がスローされます。

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)
28
London guy

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

したがって、デフォルトのコンストラクタを追加するだけです。

public StockKey(){}
53
Thomas Jungblut

書き込み可能、​​マッパー、リデューサーなどのクラスでこのようなエラーが発生したときに確認する必要があるもう1つのことがあります。

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

67
Chris

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
     }

}
1
prayagupd

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

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

  public static class StockKey extends ... {}
}
1

この同じ問題に直面していた。 @Thomasおよび@Chrisからのポインタに従うことで修正されました。

問題を解決するには、これらの両方のソリューションが必要であるように見えます。

  • Hadoopはリフレクションを使用しているため、大規模なプロジェクトを構築する際には@Thomasからの回答が必要です。

  • @Chrisからの回答は、内部クラスを使用し、main()からMappers/Reducersを呼び出すときに必要です。

0
vmorusu

どんな答えも私を助けませんでした。

私の場合、誤ってまたは急いでコンストラクタの可視性を下げたときに発生しました。

例えば。親コンストラクタはパブリックであり、継承されたクラスのコンストラクタはデフォルトまたは保護されています!

0
CodeToLife