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

Lon*_*guy 28 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)
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 68

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

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

  • 你刚从吊索中拿出我的屁股.感谢关于静态内部类的解释! (3认同)
  • 我不知道内部类必须是静态的,以便在封闭类之外进行实例化,这为我节省了很多时间和挫折. (2认同)

Tho*_*lut 53

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

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

public StockKey(){}
Run Code Online (Sandbox Code Playgroud)