30

コマンド プロンプトから 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)
4

6 に答える 6

57

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

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

public StockKey(){}
于 2012-07-12T07:35:04.740 に答える
1

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

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
     }

}
于 2015-05-12T06:43:16.000 に答える
0

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

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

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

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

于 2016-12-20T20:39:33.067 に答える