Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 没有这种方法例外Hadoop<;初始化>;_Java_Hadoop_Mapreduce - Fatal编程技术网

Java 没有这种方法例外Hadoop<;初始化>;

Java 没有这种方法例外Hadoop<;初始化>;,java,hadoop,mapreduce,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.NoSuchMethodExcep

当我在命令提示符下运行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)
12/07/12 00:18:47信息映射。作业客户端:任务Id:
尝试\u 20120708224\u 0007\u m\u000000\u 1,状态:失败
java.lang.RuntimeException:java.lang.NoSuchMethodException:SecondarySort$StockKey。
()
位于org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:115)
位于org.apache.hadoop.io.WritableComparator.newKey(WritableComparator.java:109)
位于org.apache.hadoop.io.WritableComparator。(WritableComparator.java:95)
位于org.apache.hadoop.io.WritableComparator.get(WritableComparator.java:51)
位于org.apache.hadoop.mapred.JobConf.getOutputKeyComparator(JobConf.java:795)
位于org.apache.hadoop.mapred.MapTask$MapOutputBuffer。(MapTask.java:817)
位于org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:383)
位于org.apache.hadoop.mapred.MapTask.run(MapTask.java:325)
位于org.apache.hadoop.mapred.Child$4.run(Child.java:270)
位于java.security.AccessController.doPrivileged(本机方法)
位于javax.security.auth.Subject.doAs(Subject.java:396)
在
org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1127)
位于org.apache.hadoop.mapred.Child.main(Child.java:264)

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

因此,只需添加默认构造函数:

public StockKey(){}

对于可写类、映射类、还原类等,当出现类似这样的错误时,还有一件事需要检查

如果类是内部类,请确保声明为
静态
(即不需要封闭类的实例)。否则,Hadoop无法实例化您的内部类,并将给出相同的错误-需要零参数构造函数。

,我修复了添加默认构造函数的问题,如下所示

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的指示进行修复

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

  • 当Hadoop使用反射和构建大型项目时,需要@Thomas的回答

  • 当使用内部类并从main()调用映射器/还原器时,需要@Chris的回答


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

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

  public static class StockKey extends ... {}
}

它没有说“没有这样的方法StockKey方法”。剪切并粘贴真正的异常消息,并将完整的堆栈跟踪粘贴到问题中。在此处编辑。谢谢你能看一下吗?对于像我这样的未来读者,在这里,我还要警告你,要把你的可写可比实现变成一个内部类(在我的例子中,它是我的映射器的一个内部类)。我得到了与上面相同的例外情况。当我将它移动到它自己的类时,它工作得很好。我在使用内部默认值
可写
实现
可写
可写可比
时也遇到了这个问题-您不仅必须提供默认构造函数,但是默认构造函数还必须实例化任何其他
可写的
实例变量;否则你会犯错误。你也把我的屁股从吊带上弄下来了。感谢您对静态内部类的解释!我不知道内部类必须是静态的,才能在封闭类之外实例化,这节省了我太多的时间和挫折。非常感谢分享!这真的帮了我一臂之力。