2011-08-22 16 views
7

Estoy escribiendo un archivo de entrada personalizado para Hadoop 0.20.2 y me estoy ejecutando en una NoSuchMethodException de la que no me puedo deshacer. Empecé con:Formato de entrada de MapReduce personalizado: no se puede encontrar el constructor

public class ConnectionInputFormat extends FileInputFormat<Text, Connection> { 

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

Tengo este error al ejecutar:

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 

Después de conseguir el error inititially y la investigación en línea, pensé que podría ser que no tuviera un constructor sin argumentos , por lo que añade 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(); 
    } 
} 

eso tampoco funcionó, por lo que añade un segundo constructor que tomó en cualquier número de objetos:

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

Obteniendo el mismo error, y hasta ahora no han tenido éxito en encontrar una solución.

completa fuente de corriente: http://pastebin.com/2XyW5ZSS

+0

Simplemente elimine su constructor, no es necesario tener un constructor en su formato de entrada. –

Respuesta

7

Su clase ConnectionInputFormat debe ser estática. Las clases anidadas no estáticas tienen un 'esto' implícito agregado a cada constructor. Por lo tanto, su constructor no-arg en realidad tiene un argumento invisible a menos que la clase se declare estática.

+2

Llegamos a una conclusión similar después de una depuración difícil anoche. El "este" que se envía al constructor era la clase principal (TestInputJob). La clase estaba entonces comparando el número de parámetros en los constructores de "esto" o TestInputJob (no hay ninguno) con el número de parámetros en los constructores en la clase anidada ConnectionInputFormat. Como obviamente son diferentes, estaba fallando. – BugsPray

+0

@BugsPray: Eso es lo que estaba tratando de decir. Tu fraseología es mejor. –

Cuestiones relacionadas