2017-05-11 2 views
10

Zuvor verwendete ich org.apache.hadoop.mapred.JobClient#getJob(org.apache.hadoop.mapred.JobID), um die RunningJob zu erhalten. Dieser Aufruf wurde von der Job-Completion-Callback-Methode ausgeführt, scheint mir jedoch, dass es ein Timing-Problem gibt, bei dem, wenn der Job bereits abgeschlossen ist, die obige getJob()-Methode diese nicht finden kann und null zurückgibt. Ich kann bestätigen, dass der Job über die Cluster-Benutzeroberfläche abgeschlossen wurde.Bestehenden mapreduce-Job vom Cluster erhalten (der Job könnte ausgeführt werden oder abgeschlossen)

die RunningJob Keeping abgesehen, gibt es eine Möglichkeit, das org.apache.hadoop.mapreduce.Job Objekt einer mapred Aufgabe, die org.apache.hadoop.mapreduce.JobID gegeben zu erhalten, unabhängig davon, ob der Job gerade läuft oder abgeschlossen ist?

Ich habe versucht, so etwas wie zu kodieren bis:

Cluster cluster = jobClient.getClusterHandle(); Job job = cluster.getJob(JobID.forName(jobId)); log.info("Trying to get actual job with id {} , found {} on cluster {}", JobID.forName(jobId), job, cluster);

ich die richtige jobId sehen können, und auch die Cluster-Objekt sehen kann .. aber die cluster.getJob() Methode gibt null zurück, so dass die Arbeit selbst ist null .

Gibt es etwas, das ich hier verpasse?

Antwort

5

Das Problem war mit mit einem aktuellen Garn-Upgrade, das MR Historien-Server auf meinem System erforderlich zu ermöglichen. Dies behebt das Problem. Ich habe vor kurzem ein Upgrade von MR v1 auf v2 durchgeführt, und bei diesem Upgrade werden alle abgeschlossenen Jobs jetzt auf den Verlaufsserver verschoben.

0

Sie suchen getAllJobStatuses() die JobStatus[] zurück:

List<JobStatus> runningJobs = new ArrayList<JobStatus>(); 
    List<JobStatus> completedJobs = new ArrayList<JobStatus>(); 
    for (JobStatus job : cluster.getAllJobStatuses()) { 
    if (!job.isJobComplete()) { 
     runningJobs.add(job); 
    } 
    else { 
     completedJobs.add(job) 
    } 
    } 

    // list of running JobIDs 
    for (JobStatus rjob : runningJobs) { 
     System.out.println(rjob.getJobID().toString()); 
    } 
    // list of completed JobIDs 
    for (JobStatus cjob : completedJobs) { 
     System.out.println(cjob.getJobID().toString()); 
    } 

    // to print out short report on running jobs: 
    // displayJobList(runningJobs.toArray(new JobStatus[0])); 
+0

Ich brauche keine laufenden Jobs .. Ich brauche eine API, die sowohl laufende als auch abgeschlossene Jobs zurückgeben kann. –

+0

Dies kann über getAllJobStatuses() abgerufen werden. Ich habe die Bearbeitung vorgenommen, die laufende Jobs von abgeschlossenen trennt. – Denis

+0

Ich brauche die MR-Zähler für abgeschlossene Jobs. –

Verwandte Themen