当我从命令提示符运行hadoop.jar文件时,它抛出一个异常,表示没有这样的方法stockkey method。
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条答案
按热度按时间kb5ga3dv1#
也面临着同样的问题。通过跟随@thomas和@chris的指针修复。
似乎需要这两种解决方案来解决问题:
当hadoop使用反射和构建大型项目时,需要@thomas的回答。
当使用内部类并从main()调用Map器/还原器时,需要@chris的回答。
sq1bmfud2#
对于scala,我也修复了添加默认构造函数的问题,如下所示,
rqdpfwrv3#
您必须在密钥类中提供一个空的默认构造函数。hadoop使用反射,它不能猜测任何要输入的参数。
所以只需添加默认构造函数:
kq0g1dla4#
确保您有默认的构造函数,但我还必须添加
static
关键字到我的类声明。也就是说,ohtdti5x5#
没有任何答案对我有帮助。
在我的情况下,它发生时,我降低了建设者的能见度错误或匆忙。
e、 父构造函数是公共的,继承类的构造函数是默认的或受保护的!
lpwwtiir6#
对于可写类、Map类、归约类等,当出现这样的错误时,还有一件事需要检查。
如果类是内部类,请确保声明了它
static
(即不需要封闭类的示例)。否则,hadoop无法示例化内部类,并将给出相同的错误-需要零参数构造函数。