No such method exception Hadoop

Kiedy prowadzę Hadoop .plik jar z wiersza polecenia, rzuca wyjątek mówiąc nie takiej metody StockKey metoda.

StockKey to moja własna Klasa zdefiniowana dla mojego własnego typu klucza.

Oto wyjątek:

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)
Author: London guy, 2012-07-12

6 answers

Musisz podać pusty konstruktor domyślny w swojej klasie kluczy. Hadoop używa reflection i nie może odgadnąć żadnych parametrów do paszy.

Więc po prostu dodaj domyślny konstruktor:

public StockKey(){}
 50
Author: Thomas Jungblut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-12 07:35:04

Jest jeszcze jedna rzecz do sprawdzenia podczas uzyskiwania błędów takich jak ten dla klas, które są writables, mappers, Reducer, itp.

Jeśli klasa jest klasą wewnętrzną , upewnij się, że jest zadeklarowana static (tzn. nie potrzebuje instancji klasy zamkniętej). W przeciwnym razie, Hadoop nie może utworzyć instancji wewnętrznej klasy i da ten sam błąd - że konstruktor zero-arg jest potrzebny.

 65
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-13 10:16:03

Również dla Scali , naprawiłem problem z dodaniem domyślnego konstruktora jak poniżej,

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
     }

}
 1
Author: prayagupd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:21

Upewnij się, że masz domyślny konstruktor, ale musiałem również dodać słowo kluczowe static do mojej deklaracji klasy. Czyli

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

  public static class StockKey extends ... {}
}
 1
Author: Josh Przybyszewski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-18 14:26:30

Żadna odpowiedź mi nie pomogła.

W moim przypadku stało się to, gdy przez pomyłkę lub pośpiech zmniejszyłem widoczność konstruktora.

Np. rodzic konstruktor jest publiczny, a dziedziczona klasa jest domyślna lub chroniona !

 0
Author: CodeToLife,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-21 23:16:19

Miał do czynienia z tym samym problemem. Naprawiono przez następujące wskaźniki z @ Thomas i @ Chris.

Wygląda na to, że oba te rozwiązania są potrzebne do rozwiązania problemu:

  • Odpowiedź od @ Thomas jest wymagana, ponieważ Hadoop używa reflection i przy budowaniu dużych projektów.

  • Odpowiedź od @ Chris jest wymagana podczas używania klas wewnętrznych i wywoływania maperów / reduktorów z main().

 0
Author: vmorusu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-20 20:39:33