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     */
018    package org.apache.hadoop.mapred;
019    
020    import java.util.Map;
021    
022    import org.apache.hadoop.classification.InterfaceAudience;
023    import org.apache.hadoop.classification.InterfaceStability;
024    import org.apache.hadoop.mapreduce.JobACL;
025    import 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
035    public 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       protected synchronized void setRunState(int state) {
386         super.setState(getEnum(state));
387       }
388    
389       /**
390        * @return running state of the job
391        */
392       public synchronized int getRunState() { return super.getState().getValue(); }
393         
394    
395       /** 
396        * Set the start time of the job
397        * @param startTime The startTime of the job
398        */
399       protected synchronized void setStartTime(long startTime) { 
400         super.setStartTime(startTime);
401       }
402         
403       /**
404        * @param userName The username of the job
405        */
406       protected synchronized void setUsername(String userName) { 
407         super.setUsername(userName);
408       }
409    
410       /**
411        * Used to set the scheduling information associated to a particular Job.
412        * 
413        * @param schedulingInfo Scheduling information of the job
414        */
415       protected synchronized void setSchedulingInfo(String schedulingInfo) {
416         super.setSchedulingInfo(schedulingInfo);
417       }
418    
419       protected synchronized void setJobACLs(Map<JobACL, AccessControlList> acls) {
420         super.setJobACLs(acls);
421       }
422    
423       public synchronized void setFailureInfo(String failureInfo) {
424         super.setFailureInfo(failureInfo);
425       }
426       
427      /**
428       * Set the priority of the job, defaulting to NORMAL.
429       * @param jp new job priority
430       */
431       public synchronized void setJobPriority(JobPriority jp) {
432         super.setPriority(
433           org.apache.hadoop.mapreduce.JobPriority.valueOf(jp.name()));
434       }
435      
436       /**
437        * @return Percentage of progress in maps 
438        */
439       public synchronized float mapProgress() { return super.getMapProgress(); }
440         
441       /**
442        * @return Percentage of progress in cleanup 
443        */
444       public synchronized float cleanupProgress() { 
445         return super.getCleanupProgress(); 
446       }
447         
448       /**
449        * @return Percentage of progress in setup 
450        */
451       public synchronized float setupProgress() { 
452         return super.getSetupProgress(); 
453       }
454         
455       /**
456        * @return Percentage of progress in reduce 
457        */
458       public synchronized float reduceProgress() { 
459         return super.getReduceProgress(); 
460       }
461    
462       // A utility to convert new job runstates to the old ones.
463       static int getOldNewJobRunState(
464         org.apache.hadoop.mapreduce.JobStatus.State state) {
465         return state.getValue();
466       }
467    }