当我在命令提示符下运行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)
对于可写入的类、映射器、还原器等,当遇到这样的错误时,还有另一件事需要检查。
如果该类是内部类,请确保它已声明为static
(即不需要封闭类的实例)。否则,Hadoop无法实例化您的内部类,并将给出同样的错误——需要一个零arg构造函数。
您必须在键类中提供一个空的默认构造函数。Hadoop正在使用反射,它无法猜测任何要馈送的参数。
所以只需添加默认构造函数:
public StockKey(){}
确保您有默认的构造函数,但我还必须将static
关键字添加到类声明中。也就是说,
public class SecondarySort {
public static void main(String[] args) {...}
public static class StockKey extends ... {}
}
对于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
}
}
没有任何答案帮助我。
在我的案例中,当我错误或匆忙地降低构造函数的可见性时,就会发生这种情况。
例如,父构造函数是公共的,继承类的构造函数是默认的或受保护的!
也面临同样的问题。通过以下来自@Thomas和@Chris的指针进行修复。
看来这两种解决方案都需要解决问题:
-
需要@Thomas的回答,因为Hadoop正在使用反射以及在构建大型项目时。
-
当使用内部类并从main()调用Mappers/Reducers时,需要@Chris的答案。