2012-07-12 9 views
24

Po uruchomieniu pliku .jar Hadoop z wiersza polecenia, generuje wyjątek mówiąc, że nie ma metody StockKey.Brak takiego wyjątku dla metody Hadoop <init>

StockKey to moja niestandardowa 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) 
+1

It ** does not ** say * "brak takiej metody Metoda StockKey" *. Wytnij i wklej wiadomość ** real ** exception i pełną historię stosu do pytania. –

+0

Edytowane tutaj. Dzięki. Czy możesz na to spojrzeć? –

+1

Dla przyszłego czytelnika, takiego jak ja, który zostanie tutaj skierowany, ostrzegłbym cię, aby twoja wersja WritableComparable była wewnętrzną klasą (w moim przypadku była to wewnętrzna klasa mojego programu odwzorowującego). Mam te same wyjątki jak powyżej.Kiedy przeniosłem go do klasy własnej, działało dobrze –

Odpowiedz

46

Musisz podać pustego konstruktora domyślnego w swoim kluczowym klasy. Hadoop używa odbicia i nie może odgadnąć żadnych parametrów do podania.

Więc po prostu dodać domyślnego konstruktora:

public StockKey(){} 
+1

Miałem również ten problem podczas implementacji 'Writable' i' WritableComparable' z wewnętrznym domyślnym 'Writable's - nie tylko musisz dostarczyć domyślny konstruktor, ale to domyślny konstruktor musi również tworzyć instancję dowolnych innych zmiennych instancji 'Writable'; w przeciwnym razie otrzymasz SpillError. – bbengfort

62

Jest jeszcze jedna rzecz, aby sprawdzić, kiedy otrzymuję błędy jak ten dla klas, które są writables, odwzorowujące, reduktory itp

Jeśli klasa jest wewnętrzna klasa, upewnij się, że jest zadeklarowana jako static (tzn. nie potrzebuje instancji klasy otaczającej). W przeciwnym razie Hadoop nie może utworzyć instancji twojej klasy wewnętrznej i da ten sam błąd - że potrzebny jest konstruktor o zerowym argumencie.

+3

Właśnie wyjęłaś mój tyłek z procy. Dzięki za wyjaśnienie na temat klas statycznych! –

+1

Nie wiedziałem, że wewnętrzna klasa musi być statyczna, aby utworzyć wystąpienie poza zamkniętą klasą, zaoszczędziłem mi tyle czasu i frustracji. – DragonDTG

1

For scala too, naprawiłem domyślnego konstruktora problem podczas dodawania 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 
    } 

} 
0

Nie każda odpowiedź pomogła mi.

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

E.g. Konstruktor macierzysty jest publiczny, a dziedziczony jest domyślny lub chroniony!

0

Wystąpił ten sam problem. Naprawiono za pomocą następujących wskaźników z @Thomas i @Chris.

Wygląda na to potrzebne są oba te rozwiązania, aby rozwiązać problem:

  • Odpowiedź z @Thomas jest wymagane jak Hadoop jest przy użyciu odbicia i przy budowie dużych projektów.

  • Odpowiedź z @Chris jest wymagana, gdy używasz klas wewnętrznych i wywołuje mappers/Reducers z main().

0

Upewnij się, że masz domyślny konstruktor, ale musiałem dodać słowo kluczowe static do deklaracji klasy. Oznacza to, że

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

    public static class StockKey extends ... {} 
} 
Powiązane problemy