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

71

对于可写对象、映射器、reducers 等类,当出现此类错误时,还有一件事需要检查。

如果该类是内部类,请确保已声明它static(即不需要封闭类的实例)。否则,Hadoop 无法实例化您的内部类并会给出同样的错误——需要一个零参数的构造函数。

于 2013-08-13T10:16:03.310 回答
57

您必须在密钥类中提供一个空的默认构造函数。Hadoop 正在使用反射,它无法猜测要提供的任何参数。

所以只需添加默认构造函数:

public StockKey(){}
于 2012-07-12T07:35:04.740 回答
3

确保您有默认构造函数,但我还必须将static关键字添加到我的类声明中。那是,

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

  public static class StockKey extends ... {}
}
于 2018-02-18T14:26:30.520 回答
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

没有任何答案对我有帮助。

就我而言,它发生在我错误地或匆忙地降低了构造函数的可见性时。

例如,父构造函数是公共的,而继承类的构造函数是默认的或受保护的!

于 2016-07-21T23:16:19.510 回答
0

面临同样的问题。通过遵循@Thomas 和@Chris 的指示进行修复。

看起来需要这两种解决方案来解决问题:

  • 需要@Thomas 的回答,因为 Hadoop 正在使用反射和构建大型项目。

  • 使用内部类并从 main() 调用 Mappers/Reducers 时,需要来自 @Chris 的回答。

于 2016-12-20T20:39:33.067 回答