没有这样的方法exceptionHadoop

当我从命令提示符运行Hadoop .jar文件时,它会抛出一个exception,说没有这样的方法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. () 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.(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.(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) 

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

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

 public StockKey(){} 

对于可写,映射器,缩减器等类,如果遇到这样的错误,还有另一件事要检查。

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

对于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 } } 

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

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

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

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

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

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

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

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

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