복붙노트

[HADOOP] 그러한 메소드가 없다는 예외 Hadoop <init>

HADOOP

그러한 메소드가 없다는 예외 Hadoop

명령 프롬프트에서 Hadoop .jar 파일을 실행할 때 StockKey 메서드와 같은 메서드가 없다는 예외를 throw합니다.

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)

해결법

  1. ==============================

    1.키 클래스에 빈 기본 생성자를 제공해야합니다. 하둡은 리플렉션을 사용하고 있으며 피드에 사용할 매개 변수를 추측 할 수 없습니다.

    키 클래스에 빈 기본 생성자를 제공해야합니다. 하둡은 리플렉션을 사용하고 있으며 피드에 사용할 매개 변수를 추측 할 수 없습니다.

    따라서 기본 생성자를 추가하십시오.

    public StockKey(){}
    
  2. ==============================

    2.writable, mappers, reducers 등의 클래스에서 이와 같은 오류가 발생할 때 검사해야 할 또 다른 사항이 있습니다.

    writable, mappers, reducers 등의 클래스에서 이와 같은 오류가 발생할 때 검사해야 할 또 다른 사항이 있습니다.

    클래스가 내부 클래스 인 경우 정적으로 선언되어야합니다 (즉, 내부 클래스의 인스턴스가 필요하지 않음). 그렇지 않으면 Hadoop은 내부 클래스를 인스턴스화 할 수없고 동일한 오류가 발생합니다. 즉, 0 인수 생성자가 필요합니다.

  3. ==============================

    3.스칼라의 경우에도 아래와 같이 기본 생성자를 추가하여 문제를 해결했습니다.

    스칼라의 경우에도 아래와 같이 기본 생성자를 추가하여 문제를 해결했습니다.

    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
         }
    
    }
    
  4. ==============================

    4.기본 생성자가 있는지 확인하지만 static 키워드를 클래스 선언에 추가해야합니다. 그건,

    기본 생성자가 있는지 확인하지만 static 키워드를 클래스 선언에 추가해야합니다. 그건,

    public class SecondarySort {
      public static void main(String[] args) {...}
    
      public static class StockKey extends ... {}
    }
    
  5. ==============================

    5.어떤 대답도 나를 도왔습니다.

    어떤 대답도 나를 도왔습니다.

    제 경우에는 실수로 생성자의 가시성을 줄이거 나 서둘러 생성자의 가시성을 줄였습니다.

    예 : 부모 생성자는 public이고 상속받은 클래스의 기본값은 protected이거나 protected입니다!

  6. ==============================

    6.이 같은 문제에 직면했다. @Thomas 및 @Chris의 포인터를 따라 수정했습니다.

    이 같은 문제에 직면했다. @Thomas 및 @Chris의 포인터를 따라 수정했습니다.

    문제를 해결하려면 다음 두 가지 솔루션이 필요합니다.

  7. from https://stackoverflow.com/questions/11446635/no-such-method-exception-hadoop-init by cc-by-sa and MIT license