2011-08-22 11 views
7

Sto scrivendo un InputFormat personalizzato per Hadoop 0.20.2 e sto eseguendo un NoSuchMethodException di cui non posso sbarazzarmi. Ho iniziato con:Formato di input MapReduce personalizzato - Can not Find Constructor

public class ConnectionInputFormat extends FileInputFormat<Text, Connection> { 

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

ho ottenuto questo errore durante l'esecuzione:

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 

Dopo aver ottenuto l'errore inititially e ricerca on-line, ho pensato che potrebbe essere che non ho avuto un costruttore a zero argomenti , così ho aggiunto uno:

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(); 
    } 
} 

che non ha funzionato sia, così ho aggiunto un secondo costruttore che ha avuto in qualsiasi numero di oggetti:

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(); 
    } 
} 

Ancora ottenendo lo stesso errore e finora non è riuscito a trovare una soluzione.

fonte di corrente completa: http://pastebin.com/2XyW5ZSS

+0

Basta rimuovere il costruttore, non è necessario avere un costruttore nel formato di input. –

risposta

7

La classe ConnectionInputFormat dovrebbe essere statico. Le classi nidificate non statiche hanno un implicito "questo" aggiunto a ogni costruttore. Pertanto, il tuo costruttore no-arg ha effettivamente un argomento invisibile a meno che la classe non sia dichiarata statica.

+2

È arrivato a una conclusione simile dopo aver effettuato un debugging la scorsa notte. Il "questo" inviato al costruttore era la classe genitore (TestInputJob). La classe stava quindi confrontando il numero di parametri nei costruttori di "this" o TestInputJob (non ce ne sono) al numero di parametri nei costruttori nella classe nidificata ConnectionInputFormat. Dal momento che sono ovviamente diversi, stava fallendo. – BugsPray

+0

@BugsPray: questo è quello che stavo cercando di dire. La tua formulazione è migliore. –

Problemi correlati