He escrito un programa mapreduce en Java, que puedo enviar a un clúster remoto que se ejecuta en modo distribuido. Actualmente, enviar la tarea mediante los pasos siguientes:Iniciar un trabajo de reducción de mapas de eclipse
- exportación el empleo mapreuce como un frasco (por ejemplo,
myMRjob.jar
) - enviar la tarea al clúster remoto usando el siguiente comando shell:
hadoop jar myMRjob.jar
Me gustaría enviar el trabajo directamente desde Eclipse cuando intento ejecutar el programa. ¿Cómo puedo hacer esto?
actualmente estoy usando CDH3, y una versión abreviada de mi conf es:
conf.set("hbase.zookeeper.quorum", getZookeeperServers());
conf.set("fs.default.name","hdfs://namenode/");
conf.set("mapred.job.tracker", "jobtracker:jtPort");
Job job = new Job(conf, "COUNT ROWS");
job.setJarByClass(CountRows.class);
// Set up Mapper
TableMapReduceUtil.initTableMapperJob(inputTable, scan,
CountRows.MyMapper.class, ImmutableBytesWritable.class,
ImmutableBytesWritable.class, job);
// Set up Reducer
job.setReducerClass(CountRows.MyReducer.class);
job.setNumReduceTasks(16);
// Setup Overall Output
job.setOutputFormatClass(MultiTableOutputFormat.class);
job.submit();
Cuando ejecuto esto directamente desde Eclipse, el trabajo se pone en marcha, pero Hadoop no puedo encontrar los aplicadores/reductores. Obtengo los siguientes errores:
12/06/27 23:23:29 INFO mapred.JobClient: map 0% reduce 0%
12/06/27 23:23:37 INFO mapred.JobClient: Task Id : attempt_201206152147_0645_m_000000_0, Status : FAILED
java.lang.RuntimeException: java.lang.ClassNotFoundException: com.mypkg.mapreduce.CountRows$MyMapper
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:996)
at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:212)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:602)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:323)
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)
...
¿Alguien sabe cómo pasar estos errores? Si puedo solucionar esto, puedo integrar más trabajos de MR en mis scripts, ¡lo cual sería increíble!
Tucker - yo era capaz de ejecutar el trabajo Hadoop en independiente, pero no a otros modos de Eclipse. Publiqué la consulta en los foros de Hadoop hace algún tiempo y no hubo ninguna respuesta + ve. Por cierto, Hadoop se ejecuta en el modo independiente sin ningún archivo de configuración (parámetros predeterminados). –
Cuando envía el trabajo desde dentro de Eclipse, ¿las clases del asignador/reductor están en el mismo proyecto, o el contenedor que las contiene en el classpath, y las clases en ningún otro lugar en el cp? –
@ChrisWhite La clase que contiene todo se llama CountRows. Esta clase contiene un método "principal" que establece las configuraciones de trabajo. la clase CountRows también contiene la clase para el asignador y el reductor llamados MyMapper y MyReducer, respectivamente. El trabajo funciona bien como dije cuando lancé el trabajo desde la línea de comandos escribiendo 'hadoop jar CountRows.jar' – Tucker