2011-08-22 8 views
7

Piszę niestandardowy InputFormat dla Hadoop 0.20.2 i mam uruchomiony wyjątek NoSuchMethodException, którego nie mogę się pozbyć. Zacząłem:Własny MapReduce Input Format - Nie można znaleźć konstruktora

public class ConnectionInputFormat extends FileInputFormat<Text, Connection> { 

    @Override 
    public RecordReader<Text, Connection> createRecordReader(InputSplit split, TaskAttemptContext context) throws IOException, InterruptedException { 
     return new ConnectionRecordReader(); 
    } 
} 

Mam ten błąd podczas uruchamiania:

Exception in thread "main" java.lang.RuntimeException: java.lang.NoSuchMethodException: testingground.TestInputJob$ConnectionInputFormat.<init>() 
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:115) 
at org.apache.hadoop.mapred.JobClient.writeNewSplits(JobClient.java:882) 
at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:779) 
at org.apache.hadoop.mapreduce.Job.submit(Job.java:432) 
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:447) 
at testingground.TestInputJob.run(TestInputJob.java:141) 
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65) 
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79) 
at testingground.TestInputJob.main(TestInputJob.java:156) 
Caused by: java.lang.NoSuchMethodException: testingground.TestInputJob$ConnectionInputFormat.<init>() 
at java.lang.Class.getConstructor0(Class.java:2706) 
at java.lang.Class.getDeclaredConstructor(Class.java:1985) 
at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:109) 
... 8 more 
Java Result: 1 

Po zdobyciu błąd inititially i badania on-line, pomyślałem, że może się okazać, że nie mam konstruktora zero argumentów , więc dodałam jedno:

public class ConnectionInputFormat extends FileInputFormat<Text, Connection> { 

    public ConnectionInputFormat() { 
     System.out.println("NetflowInputFormat Constructor"); 
    } 

    @Override 
    public RecordReader<Text, Connection> createRecordReader(InputSplit split, TaskAttemptContext context) throws IOException, InterruptedException { 
     return new ConnectionRecordReader(); 
    } 
} 

to nie działało, więc dodałem drugi konstruktor, który wziął w dowolnej liczbie obiektów:

public class ConnectionInputFormat extends FileInputFormat<Text, Connection> { 

    public ConnectionInputFormat() { 
     System.out.println("NetflowInputFormat Constructor"); 
    } 

    public ConnectionInputFormat(Object... o) { 
     System.out.println("NetflowInputFormat Constructor"); 
    } 

    @Override 
    public RecordReader<Text, Connection> createRecordReader(InputSplit split, TaskAttemptContext context) throws IOException, InterruptedException { 
     return new ConnectionRecordReader(); 
    } 
} 

Nadal pojawia się ten sam błąd i do tej pory nie udało się znaleźć rozwiązania.

Pełna źródło prądu: http://pastebin.com/2XyW5ZSS

+0

Wystarczy usunąć konstruktora, nie ma potrzeby, aby mieć konstruktora w swoim formacie wejściowym. –

Odpowiedz

7

Twoja klasa ConnectionInputFormat powinna być statyczna. Niestatyczne klasy zagnieżdżone mają domyślne "to" dodane do każdego konstruktora. Zatem twój konstruktor no-arg faktycznie ma niewidoczny argument, chyba że klasa zostanie zadeklarowana jako statyczna.

+2

Doszło do podobnego wniosku po twardym debugowaniu zeszłej nocy. "To" wysyłane do konstruktora było klasą nadrzędną (TestInputJob). Klasa porównała wtedy liczbę parametrów w konstruktorach "this" lub TestInputJob (nie ma żadnych) z liczbą parametrów w konstruktorach w zagnieżdżonej klasie ConnectionInputFormat. Ponieważ są oczywiście różne, zawodziło. – BugsPray

+0

@BugsPray: To właśnie próbowałem powiedzieć. Twoje sformułowanie jest lepsze. –

Powiązane problemy