2012-09-04 14 views
20

Sto provando a raccogliere alcune informazioni dal tracker di lavoro. Per cominciare mi piacerebbe iniziare con ottenere processi in esecuzione informazioni quali l'ID di lavoro o nome del lavoro ecc Ma già bloccato, ecco quello che ho (stampa gli ID di lavoro per i lavori attualmente in esecuzione):Confusione su 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); 
      } 
     } 
    } 

Questo sopra funziona come fascino quando si tenta di visualizzare l'ID del lavoro, ma ora voglio anche visualizzare il nome del lavoro. Così ho aggiunto questa linea dopo lavoro di stampa ID:

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

ottengo questa eccezione:

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 non è null. Lo so perché ho provato con il controllo null se l'istruzione, ma questo jobClient.getJob(jobId) è null. Cosa sto facendo di sbagliato qui?

Secondo l'API dovrei essere ok,

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

in primo luogo ottenere RunningJob da jobClient di una volta che avete in esecuzione lavoro quindi ottenere il suo nome http://hadoop.apache.org/mapreduce/docs/r0.21.0/api/org/apache/hadoop/mapred/RunningJob.html#getJobName()

Chiunque ha fatto qualcosa di simile prima? Potrei usare jsoup per ottenere queste informazioni tramite la richiesta GET ma penso che questo sia il modo migliore per ottenere queste informazioni.

aggiornamento domanda qui è la mia Hadoop/dipendenze HBase: aggiornamento

<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> 

Bounty:

qui sono i miei importazioni:

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; 

Ecco l'output di System.out.println(jobId):

job_201207031810_1603 

C'è solo un lavoro in esecuzione.

+1

Quale versione stai usando? 0.21 come nei tuoi link doc? –

+0

ciao Thomas che è una buona osservazione aggiornerò la mia domanda –

+0

Quindi il tuo cluster gira su 0.23.1 da CDH4 come le tue dipendenze? –

risposta

17

Dai un'occhiata alla classe interna NetworkedJob di JobClient.
(fonte: /home/user/hadoop/src/mapred/org/apache/hadoop/mapred/JobClient.java)

Il suo costruttore tenta di recuperare l'oggetto Configuration da JobClient in linea 225 ma è nulla in quanto new JobClient(InetSocketAddress jobTrackAddr, Configuration conf) non lo imposta:

// 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! 

Per aggirare il problema, impostare manualmente dopo la creazione dell'oggetto JobClient.Questo risolverà il vostro problema:

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

Nota a margine:

ho istanziato l'oggetto Configuration via:

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

Eccellente osservazione Sir! funziona se si imposta manualmente Config su jobClient, non è possibile assegnare taglie ancora –

+0

@GandalfStormCrow è possibile assegnare la taglia in qualsiasi momento facendo clic sul piccolo pulsante +250 accanto alla risposta di Lorand – HypnoticSheep