2012-09-04 5 views
20

Ich versuche, einige Informationen aus dem Job-Tracker zu sammeln. Für den Anfang würde ich mit immer laufenden Aufträge Informationen, wie zB Job-ID oder Jobnamen usw. Aber schon stecken beginnen möchte, ist hier, was ich habe (ausdruckt Job-IDs für derzeit ausgeführten Jobs):Verwirrung über 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); 
      } 
     } 
    } 

Diese über funktioniert als Charme beim Versuch, Job-ID anzuzeigen, aber jetzt möchte ich auch den Job-Namen anzeigen. Also habe ich diese Zeile nach dem Drucken Job-ID:

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

Ich erhalte diese Ausnahme:

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 ist nicht null. Ich weiß das, weil ich versucht habe, mit Null zu überprüfen, ob Aussage, aber diese jobClient.getJob(jobId) ist null. Was mache ich hier falsch?

Nach der API ich in Ordnung sein sollte,

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

Erste RunningJob von jobClient bekommen, als wenn Sie Auftrag ausgeführt haben, dann bekommen es der Name http://hadoop.apache.org/mapreduce/docs/r0.21.0/api/org/apache/hadoop/mapred/RunningJob.html#getJobName()

Wer hat so etwas wie dies vor? Ich könnte jsoup verwenden, um diese Informationen durch GET-Anfrage zu erhalten, aber ich denke, das ist der bessere Weg, um diese Informationen zu erhalten.

Frage Update hier ist mein hadoop/hbase Abhängigkeiten:

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

Hier meine Importe:

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; 

Hier ist die Ausgabe von System.out.println(jobId):

job_201207031810_1603 

Derzeit wird nur ein Job ausgeführt.

+1

Welche Version verwenden Sie? 0.21 wie in deinen doc-Links? –

+0

Hallo Thomas, das ist eine gute Beobachtung Ich werde meine Frage aktualisieren –

+0

So läuft Ihr Cluster auf 0.23.1 von CDH4 wie Ihre Abhängigkeiten? –

Antwort

17

Werfen Sie einen Blick auf die innere Klasse NetworkedJob von JobClient.
(Quelle: /home/user/hadoop/src/mapred/org/apache/hadoop/mapred/JobClient.java)

Der Konstruktor versucht, das Configuration Objekt aus JobClient in Zeile 225, aber es ist null, da zu holen new JobClient(InetSocketAddress jobTrackAddr, Configuration conf) es nicht gesetzt:

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

Als Abhilfe gesetzt es manuell nach dem JobClient Objekt zu erzeugen.Dies wird Ihr Problem lösen:

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

Nebenbei bemerkt:

ich instanziiert das Configuration Objekt über:

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

Ausgezeichnete Beobachtung, Sir! funktioniert, wenn Sie manuellConf zu jobClient setzen, kann noch keine Kopfgeld zuweisen –

+0

@ GandalfStormCrow Sie können das Kopfgeld jederzeit durch Klicken auf die kleine + 250-Schaltfläche neben Lorands Antwort vergeben – HypnoticSheep