it-swarm.com.de

Keine solche Ausnahmemethode Hadoop <init>

Wenn ich eine Hadoop-.jar-Datei über den Befehl Prompt ausführte, wird eine Ausnahme ausgegeben, die keine solche Methode der StockKey-Methode angibt.

StockKey ist meine benutzerdefinierte Klasse, die für meinen eigenen Schlüsseltyp definiert ist.

Hier ist die Ausnahme:

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)
28
London guy

Sie müssen einen leeren Standardkonstruktor in Ihrer Schlüsselklasse angeben. Hadoop verwendet Reflektion und kann keine Parameter erraten.

Fügen Sie also einfach den Standardkonstruktor hinzu:

public StockKey(){}
53
Thomas Jungblut

Es ist noch eine andere Sache zu prüfen, wenn solche Fehler für Klassen angezeigt werden, die schreibbar sind, Mapper, Reduzierer usw.

Wenn es sich bei der Klasse um eine innere Klasse handelt, stellen Sie sicher, dass sie als static deklariert ist (d. H. Keine Instanz der umgebenden Klasse benötigt). Andernfalls kann Hadoop Ihre innere Klasse nicht instanziieren und gibt denselben Fehler aus, dh es wird ein Zero-Arg-Konstruktor benötigt.

66
Chris

Auch für Scala habe ich das Problem beim Hinzufügen des Standardkonstruktors behoben. 

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
prayagupd

Stellen Sie sicher, dass Sie über den Standardkonstruktor verfügen, aber ich musste auch das Schlüsselwort static zu meiner Klassendeklaration hinzufügen. Das ist,

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

  public static class StockKey extends ... {}
}
1

Stand vor demselben Problem. Festgelegt durch folgende Zeiger von @Thomas und @Chris.

Sieht aus, als wären beide Lösungen erforderlich, um das Problem zu lösen:

  • Die Antwort von @Thomas ist erforderlich, da Hadoop Reflection verwendet und große Projekte erstellt.

  • Die Antwort von @Chris ist erforderlich, wenn Sie innere Klassen verwenden und Mappers/Reductions von main () aufrufen.

0
vmorusu

Keine Antwort hat mir geholfen.

In meinem Fall passierte es, als ich aus Versehen oder Eile die Sichtbarkeit des Konstruktors reduzierte.

Z.B. Der übergeordnete Konstruktor ist öffentlich und der vererbte Klasse ist standardmäßig oder geschützt!

0
CodeToLife