没有这样的方法异常Hadoop <init> </init>

时间:2012-07-12 07:08:14

标签: java hadoop mapreduce

当我从命令提示符运行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)

6 个答案:

答案 0 :(得分:67)

对于可写,mappers,reducer等类,如果遇到这样的错误,还有另外一件事要检查。

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

答案 1 :(得分:53)

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

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

public StockKey(){}

答案 2 :(得分: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
     }

}

答案 3 :(得分:1)

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

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

  public static class StockKey extends ... {}
}

答案 4 :(得分:0)

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

就我而言,当我错误地或匆忙地减少构造函数的可见性时,就发生了这种情况。

E.g。父构造函数是公共的,继承的类是默认的或受保护的!

答案 5 :(得分:0)

正面临同样的问题。 通过以下来自@Thomas和@Chris的指针修复。

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

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

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