No such method exception Hadoop

2019-01-08 17:22发布

When I am running a Hadoop .jar file from the command prompt, it throws an exception saying no such method StockKey method.

StockKey is my custom class defined for my own type of key.

Here is the exception:

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条回答
聊天终结者
2楼-- · 2019-01-08 17:45

For scala too, I fixed the problem adding default constructor as below,

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
     }

}
查看更多
家丑人穷心不美
3楼-- · 2019-01-08 17:46

No any answer helped me.

In my case it happened when me reduced constructor visibility by mistake or hurry.

E.g. parent constructor is public and inherited class's one is default or protected !

查看更多
不美不萌又怎样
4楼-- · 2019-01-08 17:47

There's another thing to check when getting errors like this for classes which are writables, mappers, reducers, etc.

If the class is an inner class, make sure it's declared static (i.e. doesn't need an instance of the enclosing class). Otherwise, Hadoop cannot instantiate your inner class and will give this same error - that a zero-arg constructor is needed.

查看更多
Viruses.
5楼-- · 2019-01-08 18:00

You have to provide an empty default constructor in your key class. Hadoop is using reflection and it can not guess any parameters to feed.

So just add the default constructor:

public StockKey(){}
查看更多
爱情/是我丢掉的垃圾
6楼-- · 2019-01-08 18:03

Make sure you have the default constructor, but I also had to add the static keyword to my class declaration. That is,

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

  public static class StockKey extends ... {}
}
查看更多
霸刀☆藐视天下
7楼-- · 2019-01-08 18:03

Was facing this same issue. Fixed by following pointers from @Thomas and @Chris.

Looks like both these solutions are needed to solve the problem :

  • Answer from @Thomas is required as Hadoop is using reflection and when building large projects.

  • Answer from @Chris is required when using inner classes and invoking Mappers/Reducers from main().

查看更多
登录 后发表回答