001/**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.hadoop.mapred;
019
020import java.util.Map;
021
022import org.apache.hadoop.classification.InterfaceAudience;
023import org.apache.hadoop.classification.InterfaceStability;
024import org.apache.hadoop.mapreduce.JobACL;
025import org.apache.hadoop.security.authorize.AccessControlList;
026
027/**************************************************
028 * Describes the current status of a job.  This is
029 * not intended to be a comprehensive piece of data.
030 * For that, look at JobProfile.
031 *************************************************
032 **/
033@InterfaceAudience.Public
034@InterfaceStability.Stable
035public class JobStatus extends org.apache.hadoop.mapreduce.JobStatus {
036
037  public static final int RUNNING = 
038    org.apache.hadoop.mapreduce.JobStatus.State.RUNNING.getValue();
039  public static final int SUCCEEDED = 
040    org.apache.hadoop.mapreduce.JobStatus.State.SUCCEEDED.getValue();
041  public static final int FAILED = 
042    org.apache.hadoop.mapreduce.JobStatus.State.FAILED.getValue();
043  public static final int PREP = 
044    org.apache.hadoop.mapreduce.JobStatus.State.PREP.getValue();
045  public static final int KILLED = 
046    org.apache.hadoop.mapreduce.JobStatus.State.KILLED.getValue();
047
048  private static final String UNKNOWN = "UNKNOWN";
049  
050  private static final String[] runStates =
051    {UNKNOWN, "RUNNING", "SUCCEEDED", "FAILED", "PREP", "KILLED"};
052
053  /**
054   * Helper method to get human-readable state of the job.
055   * @param state job state
056   * @return human-readable state of the job
057   */
058  public static String getJobRunState(int state) {
059    if (state < 1 || state >= runStates.length) {
060      return UNKNOWN;
061    }
062    return runStates[state];
063  }
064  
065  static org.apache.hadoop.mapreduce.JobStatus.State getEnum(int state) {
066    switch (state) {
067      case 1: return org.apache.hadoop.mapreduce.JobStatus.State.RUNNING;
068      case 2: return org.apache.hadoop.mapreduce.JobStatus.State.SUCCEEDED;
069      case 3: return org.apache.hadoop.mapreduce.JobStatus.State.FAILED;
070      case 4: return org.apache.hadoop.mapreduce.JobStatus.State.PREP;
071      case 5: return org.apache.hadoop.mapreduce.JobStatus.State.KILLED;
072    }
073    return null;
074  }
075  
076  /**
077   */
078  public JobStatus() {
079  }
080  
081  @Deprecated
082  public JobStatus(JobID jobid, float mapProgress, float reduceProgress,
083      float cleanupProgress, int runState) {
084    this(jobid, mapProgress, reduceProgress, cleanupProgress, runState, null,
085        null, null, null);
086  }
087
088  /**
089   * Create a job status object for a given jobid.
090   * @param jobid The jobid of the job
091   * @param mapProgress The progress made on the maps
092   * @param reduceProgress The progress made on the reduces
093   * @param runState The current state of the job
094   */
095  @Deprecated
096  public JobStatus(JobID jobid, float mapProgress, float reduceProgress,
097      int runState) {
098    this (jobid, mapProgress, reduceProgress, runState, null, null, null, null);
099  }
100
101  /**
102   * Create a job status object for a given jobid.
103   * @param jobid The jobid of the job
104   * @param mapProgress The progress made on the maps
105   * @param reduceProgress The progress made on the reduces
106   * @param runState The current state of the job
107   * @param jp Priority of the job.
108   */
109  @Deprecated
110  public JobStatus(JobID jobid, float mapProgress, float reduceProgress,
111      float cleanupProgress, int runState, JobPriority jp) {
112    this(jobid, mapProgress, reduceProgress, cleanupProgress, runState, jp,
113        null, null, null, null);
114  }
115
116  /**
117   * Create a job status object for a given jobid.
118   * @param jobid The jobid of the job
119   * @param setupProgress The progress made on the setup
120   * @param mapProgress The progress made on the maps
121   * @param reduceProgress The progress made on the reduces
122   * @param cleanupProgress The progress made on the cleanup
123   * @param runState The current state of the job
124   * @param jp Priority of the job.
125   */
126  @Deprecated
127  public JobStatus(JobID jobid, float setupProgress, float mapProgress,
128      float reduceProgress, float cleanupProgress, 
129      int runState, JobPriority jp) {
130    this(jobid, setupProgress, mapProgress, reduceProgress, cleanupProgress,
131        runState, jp, null, null, null, null);
132  }
133
134  /**
135   * Create a job status object for a given jobid.
136   * @param jobid The jobid of the job
137   * @param mapProgress The progress made on the maps
138   * @param reduceProgress The progress made on the reduces
139   * @param cleanupProgress The progress made on cleanup
140   * @param runState The current state of the job
141   * @param user userid of the person who submitted the job.
142   * @param jobName user-specified job name.
143   * @param jobFile job configuration file. 
144   * @param trackingUrl link to the web-ui for details of the job.
145   */
146  public JobStatus(JobID jobid, float mapProgress, float reduceProgress,
147                   float cleanupProgress, int runState, 
148                   String user, String jobName, 
149                   String jobFile, String trackingUrl) {
150    this(jobid, mapProgress, reduceProgress, cleanupProgress, runState,
151        JobPriority.NORMAL, user, jobName, jobFile, trackingUrl);
152  }
153
154  /**
155   * Create a job status object for a given jobid.
156   * @param jobid The jobid of the job
157   * @param mapProgress The progress made on the maps
158   * @param reduceProgress The progress made on the reduces
159   * @param runState The current state of the job
160   * @param user userid of the person who submitted the job.
161   * @param jobName user-specified job name.
162   * @param jobFile job configuration file. 
163   * @param trackingUrl link to the web-ui for details of the job.
164   */
165  public JobStatus(JobID jobid, float mapProgress, float reduceProgress,
166                   int runState, String user, String jobName, 
167                   String jobFile, String trackingUrl) {
168    this(jobid, mapProgress, reduceProgress, 0.0f, runState, user, jobName, 
169        jobFile, trackingUrl);
170  }
171
172  /**
173   * Create a job status object for a given jobid.
174   * @param jobid The jobid of the job
175   * @param mapProgress The progress made on the maps
176   * @param reduceProgress The progress made on the reduces
177   * @param runState The current state of the job
178   * @param jp Priority of the job.
179   * @param user userid of the person who submitted the job.
180   * @param jobName user-specified job name.
181   * @param jobFile job configuration file. 
182   * @param trackingUrl link to the web-ui for details of the job.
183   */
184   public JobStatus(JobID jobid, float mapProgress, float reduceProgress,
185                      float cleanupProgress, int runState, JobPriority jp, 
186                      String user, String jobName, String jobFile, 
187                      String trackingUrl) {
188     this(jobid, 0.0f, mapProgress, reduceProgress, 
189          cleanupProgress, runState, jp, user, jobName, jobFile,
190          trackingUrl);
191   }
192   
193  /**
194   * Create a job status object for a given jobid.
195   * @param jobid The jobid of the job
196   * @param setupProgress The progress made on the setup
197   * @param mapProgress The progress made on the maps
198   * @param reduceProgress The progress made on the reduces
199   * @param cleanupProgress The progress made on the cleanup
200   * @param runState The current state of the job
201   * @param jp Priority of the job.
202   * @param user userid of the person who submitted the job.
203   * @param jobName user-specified job name.
204   * @param jobFile job configuration file. 
205   * @param trackingUrl link to the web-ui for details of the job.
206   */
207   public JobStatus(JobID jobid, float setupProgress, float mapProgress,
208                    float reduceProgress, float cleanupProgress, 
209                    int runState, JobPriority jp, String user, String jobName, 
210                    String jobFile, String trackingUrl) {
211     this(jobid, setupProgress, mapProgress, reduceProgress, cleanupProgress,
212         runState, jp, user, jobName, "default", jobFile, trackingUrl);
213   }
214
215   /**
216    * Create a job status object for a given jobid.
217    * @param jobid The jobid of the job
218    * @param setupProgress The progress made on the setup
219    * @param mapProgress The progress made on the maps
220    * @param reduceProgress The progress made on the reduces
221    * @param cleanupProgress The progress made on the cleanup
222    * @param runState The current state of the job
223    * @param jp Priority of the job.
224    * @param user userid of the person who submitted the job.
225    * @param jobName user-specified job name.
226    * @param jobFile job configuration file. 
227    * @param trackingUrl link to the web-ui for details of the job.
228    * @param isUber Whether job running in uber mode
229    */
230    public JobStatus(JobID jobid, float setupProgress, float mapProgress,
231                     float reduceProgress, float cleanupProgress, 
232                     int runState, JobPriority jp, String user, String jobName, 
233                     String jobFile, String trackingUrl, boolean isUber) {
234      this(jobid, setupProgress, mapProgress, reduceProgress, cleanupProgress,
235          runState, jp, user, jobName, "default", jobFile, trackingUrl, isUber);
236    }   
237   
238   /**
239    * Create a job status object for a given jobid.
240    * @param jobid The jobid of the job
241    * @param setupProgress The progress made on the setup
242    * @param mapProgress The progress made on the maps
243    * @param reduceProgress The progress made on the reduces
244    * @param cleanupProgress The progress made on the cleanup
245    * @param runState The current state of the job
246    * @param jp Priority of the job.
247    * @param user userid of the person who submitted the job.
248    * @param jobName user-specified job name.
249    * @param queue job queue name.
250    * @param jobFile job configuration file.
251    * @param trackingUrl link to the web-ui for details of the job.
252    */
253   public JobStatus(JobID jobid, float setupProgress, float mapProgress,
254       float reduceProgress, float cleanupProgress,
255       int runState, JobPriority jp,
256       String user, String jobName, String queue,
257       String jobFile, String trackingUrl) {
258     this(jobid, setupProgress, mapProgress, reduceProgress, cleanupProgress,
259         runState, jp,
260         user, jobName, queue, jobFile, trackingUrl, false);
261   }
262
263   /**
264    * Create a job status object for a given jobid.
265    * @param jobid The jobid of the job
266    * @param setupProgress The progress made on the setup
267    * @param mapProgress The progress made on the maps
268    * @param reduceProgress The progress made on the reduces
269    * @param cleanupProgress The progress made on the cleanup
270    * @param runState The current state of the job
271    * @param jp Priority of the job.
272    * @param user userid of the person who submitted the job.
273    * @param jobName user-specified job name.
274    * @param queue job queue name.
275    * @param jobFile job configuration file. 
276    * @param trackingUrl link to the web-ui for details of the job.
277    * @param isUber Whether job running in uber mode
278    */
279   public JobStatus(JobID jobid, float setupProgress, float mapProgress,
280       float reduceProgress, float cleanupProgress, 
281       int runState, JobPriority jp, 
282       String user, String jobName, String queue, 
283       String jobFile, String trackingUrl, boolean isUber) {
284     super(jobid, setupProgress, mapProgress, reduceProgress, cleanupProgress,
285         getEnum(runState), org.apache.hadoop.mapreduce.JobPriority.valueOf(jp.name()),
286         user, jobName, queue, jobFile, trackingUrl, isUber);
287   }
288
289  public static JobStatus downgrade(org.apache.hadoop.mapreduce.JobStatus stat){
290    JobStatus old = new JobStatus(JobID.downgrade(stat.getJobID()),
291      stat.getSetupProgress(), stat.getMapProgress(), stat.getReduceProgress(),
292      stat.getCleanupProgress(), stat.getState().getValue(), 
293      JobPriority.valueOf(stat.getPriority().name()),
294      stat.getUsername(), stat.getJobName(), stat.getQueue(), stat.getJobFile(),
295      stat.getTrackingUrl(), stat.isUber());
296    old.setStartTime(stat.getStartTime());
297    old.setFinishTime(stat.getFinishTime());
298    old.setSchedulingInfo(stat.getSchedulingInfo());
299    old.setHistoryFile(stat.getHistoryFile());
300    return old;
301  }
302  /**
303   * @deprecated use getJobID instead
304   */
305  @Deprecated
306  public String getJobId() { return getJobID().toString(); }
307  
308  /**
309   * @return The jobid of the Job
310   */
311  public JobID getJobID() { return JobID.downgrade(super.getJobID()); }
312  
313  /**
314   * Return the priority of the job
315   * @return job priority
316   */
317   public synchronized JobPriority getJobPriority() { 
318     return JobPriority.valueOf(super.getPriority().name());
319   }
320
321   /**
322    * Sets the map progress of this job
323    * @param p The value of map progress to set to
324    */
325   protected synchronized void setMapProgress(float p) { 
326     super.setMapProgress(p); 
327   }
328
329   /**
330    * Sets the cleanup progress of this job
331    * @param p The value of cleanup progress to set to
332    */
333   protected synchronized void setCleanupProgress(float p) { 
334     super.setCleanupProgress(p); 
335   }
336
337   /**
338    * Sets the setup progress of this job
339    * @param p The value of setup progress to set to
340    */
341   protected synchronized void setSetupProgress(float p) { 
342     super.setSetupProgress(p); 
343   }
344
345   /**
346    * Sets the reduce progress of this Job
347    * @param p The value of reduce progress to set to
348    */
349   protected synchronized void setReduceProgress(float p) { 
350     super.setReduceProgress(p); 
351   }
352     
353   /** 
354    * Set the finish time of the job
355    * @param finishTime The finishTime of the job
356    */
357   protected synchronized void setFinishTime(long finishTime) {
358     super.setFinishTime(finishTime);
359   }
360
361   /**
362    * Set the job history file url for a completed job
363    */
364   protected synchronized void setHistoryFile(String historyFile) {
365     super.setHistoryFile(historyFile);
366   }
367
368   /**
369    * Set the link to the web-ui for details of the job.
370    */
371   protected synchronized void setTrackingUrl(String trackingUrl) {
372     super.setTrackingUrl(trackingUrl);
373   }
374
375   /**
376    * Set the job retire flag to true.
377    */
378   protected synchronized void setRetired() {
379     super.setRetired();
380   }
381
382   /**
383    * Change the current run state of the job.
384    *
385    * The setter is public to be compatible with M/R 1.x, however, it should be
386    * used internally.
387    *
388    * @param state the state of the job
389    */
390   @InterfaceAudience.Private
391   public synchronized void setRunState(int state) {
392     super.setState(getEnum(state));
393   }
394
395   /**
396    * @return running state of the job
397    */
398   public synchronized int getRunState() { return super.getState().getValue(); }
399     
400
401   /** 
402    * Set the start time of the job
403    * @param startTime The startTime of the job
404    */
405   protected synchronized void setStartTime(long startTime) { 
406     super.setStartTime(startTime);
407   }
408     
409   /**
410    * @param userName The username of the job
411    */
412   protected synchronized void setUsername(String userName) { 
413     super.setUsername(userName);
414   }
415
416   /**
417    * Used to set the scheduling information associated to a particular Job.
418    *
419    * The setter is public to be compatible with M/R 1.x, however, it should be
420    * used internally.
421    *
422    * @param schedulingInfo Scheduling information of the job
423    */
424   @InterfaceAudience.Private
425   public synchronized void setSchedulingInfo(String schedulingInfo) {
426     super.setSchedulingInfo(schedulingInfo);
427   }
428
429   protected synchronized void setJobACLs(Map<JobACL, AccessControlList> acls) {
430     super.setJobACLs(acls);
431   }
432
433   public synchronized void setFailureInfo(String failureInfo) {
434     super.setFailureInfo(failureInfo);
435   }
436   
437  /**
438   * Set the priority of the job, defaulting to NORMAL.
439   * @param jp new job priority
440   */
441   public synchronized void setJobPriority(JobPriority jp) {
442     super.setPriority(
443       org.apache.hadoop.mapreduce.JobPriority.valueOf(jp.name()));
444   }
445  
446   /**
447    * @return Percentage of progress in maps 
448    */
449   public synchronized float mapProgress() { return super.getMapProgress(); }
450     
451   /**
452    * @return Percentage of progress in cleanup 
453    */
454   public synchronized float cleanupProgress() { 
455     return super.getCleanupProgress(); 
456   }
457     
458   /**
459    * @return Percentage of progress in setup 
460    */
461   public synchronized float setupProgress() { 
462     return super.getSetupProgress(); 
463   }
464     
465   /**
466    * @return Percentage of progress in reduce 
467    */
468   public synchronized float reduceProgress() { 
469     return super.getReduceProgress(); 
470   }
471
472   // A utility to convert new job runstates to the old ones.
473   static int getOldNewJobRunState(
474     org.apache.hadoop.mapreduce.JobStatus.State state) {
475     return state.getValue();
476   }
477}