2012-09-04 20 views
20

Intento recopilar información del rastreador de trabajos. Para empezar me gustaría empezar con conseguir trabajos que se ejecutan información, tales como identificador o nombre del trabajo, etc. Pero ya atascado, esto es lo que tengo (imprime los identificadores de trabajo de los trabajos que se están ejecutando):Confusión sobre hadoop job tracker api

public static void main(String[] args) throws IOException { 
     Configuration conf = HBaseConfiguration.create(); 
     conf.set("hbase.zookeeper.quorum", "zk1.myhost,zk2.myhost,zk3.myhost"); 
     conf.set("hbase.zookeeper.property.clientPort", "2181"); 

     InetSocketAddress jobtracker = new InetSocketAddress("jobtracker.mapredhost.myhost", 8021); 
     JobClient jobClient = new JobClient(jobtracker, conf); 
     JobStatus[] jobs = jobClient.jobsToComplete(); 

     for (int i = 0; i < jobs.length; i++) { 
      JobStatus js = jobs[i]; 
      if (js.getRunState() == JobStatus.RUNNING) { 
       JobID jobId = js.getJobID(); 
       System.out.println(jobId); 
      } 
     } 
    } 

Este anterior funciona como un encanto al intentar mostrar la identificación del trabajo, pero ahora también quiero mostrar el nombre del trabajo. Por lo que añade esta línea después de Identificación del trabajo de impresión:

System.out.println(jobClient.getJob(jobId).getJobName()); 

consigo esta excepción:

Exception in thread "main" java.lang.NullPointerException 
    at org.apache.hadoop.mapred.JobClient$NetworkedJob.<init>(JobClient.java:226) 
    at org.apache.hadoop.mapred.JobClient.getJob(JobClient.java:1080) 
    at org.apache.test.JobTracker.main(JobTracker.java:28) 

jobClient no es null. Lo sé porque lo intenté con el cheque nulo si la declaración, pero este jobClient.getJob(jobId) es null. ¿Qué estoy haciendo mal aquí?

De acuerdo con la API que debería estar bien,

http://hadoop.apache.org/mapreduce/docs/r0.21.0/api/org/apache/hadoop/mapred/JobClient.html#getJob(org.apache.hadoop.mapred.JobID)

En primer lugar obtener RunningJob de jobClient que una vez que haya un trabajo en ejecución a continuación, obtener su nombre http://hadoop.apache.org/mapreduce/docs/r0.21.0/api/org/apache/hadoop/mapred/RunningJob.html#getJobName()

Cualquier persona hizo algo como esto antes? Podría usar jsoup para obtener esta información a través de la solicitud GET, pero creo que esta es una mejor manera de obtener esta información.

actualización pregunta aquí es mis Hadoop/dependencias HBase: Actualizar

<dependency> 
      <groupId>org.apache.hadoop</groupId> 
      <artifactId>hadoop-client</artifactId> 
      <version>0.23.1-mr1-cdh4.0.0b2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.hadoop</groupId> 
      <artifactId>hadoop-core</artifactId> 
      <version>0.23.1-mr1-cdh4.0.0b2</version> 
      <exclusions> 
       <exclusion> 
        <groupId>org.mortbay.jetty</groupId> 
        <artifactId>jetty</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>javax.servlet</groupId> 
        <artifactId>servlet-api</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.hbase</groupId> 
      <artifactId>hbase</artifactId> 
      <version>0.92.1-cdh4b2-SNAPSHOT</version> 
     </dependency> 

Recompensa:

Éstos son mis importaciones:

import java.io.IOException; 
import java.net.InetSocketAddress; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.hbase.HBaseConfiguration; 
import org.apache.hadoop.mapred.JobClient; 
import org.apache.hadoop.mapred.JobID; 
import org.apache.hadoop.mapred.JobStatus; 

Aquí está la salida de System.out.println(jobId):

job_201207031810_1603 

Solo hay un trabajo actualmente ejecutándose.

+1

¿Qué versión está usando? 0.21 como en tus enlaces de doc? –

+0

Hola Thomas, es una buena observación. Actualizaré mi pregunta. –

+0

¿Entonces su clúster se ejecuta en 0.23.1 desde CDH4 como sus dependencias? –

Respuesta

17

Eche un vistazo a la clase interna NetworkedJob de JobClient.
(fuente: /home/user/hadoop/src/mapred/org/apache/hadoop/mapred/JobClient.java)

su constructor intenta recoger el objeto de ConfigurationJobClient en la línea 225, pero es nula, ya new JobClient(InetSocketAddress jobTrackAddr, Configuration conf) no establece que:

// Set the completion poll interval from the configuration. 
     // Default is 5 seconds. 
     Configuration conf = JobClient.this.getConf(); 
     this.completionPollIntervalMillis = conf.getInt(COMPLETION_POLL_INTERVAL_KEY, 
      DEFAULT_COMPLETION_POLL_INTERVAL); //NPE occurs here! 

Como solución, ajuste manualmente después de crear el objeto JobClient.Esto va a resolver su problema:

.. 
JobClient jobClient = new JobClient(jobtracker, conf); 
jobClient.setConf(conf); 
.... 

Nota al margen:

Me instancia del objeto a través de Configuration:

Configuration conf = new Configuration(); 
conf.addResource(new Path("/path_to/core-site.xml")); 
conf.addResource(new Path("/path_to/hdfs-site.xml")); 
+0

Excelente observación Señor! funciona si configura manualmenteConf para jobClient, no puede asignar recompensa aún –

+0

@GandalfStormCrow puede otorgar la recompensa en cualquier momento haciendo clic en el pequeño botón +250 junto a la respuesta de Lorand – HypnoticSheep