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 019package org.apache.hadoop.mapred.jobcontrol; 020 021 022import java.io.IOException; 023import java.util.ArrayList; 024import java.util.List; 025 026import org.apache.commons.logging.Log; 027import org.apache.commons.logging.LogFactory; 028import org.apache.hadoop.classification.InterfaceAudience; 029import org.apache.hadoop.classification.InterfaceStability; 030import org.apache.hadoop.mapred.JobClient; 031import org.apache.hadoop.mapred.JobConf; 032import org.apache.hadoop.mapred.JobID; 033import org.apache.hadoop.mapreduce.lib.jobcontrol.ControlledJob; 034 035@InterfaceAudience.Public 036@InterfaceStability.Stable 037public class Job extends ControlledJob { 038 static final Log LOG = LogFactory.getLog(Job.class); 039 040 final public static int SUCCESS = 0; 041 final public static int WAITING = 1; 042 final public static int RUNNING = 2; 043 final public static int READY = 3; 044 final public static int FAILED = 4; 045 final public static int DEPENDENT_FAILED = 5; 046 047 /** 048 * Construct a job. 049 * @param jobConf a mapred job configuration representing a job to be executed. 050 * @param dependingJobs an array of jobs the current job depends on 051 */ 052 @SuppressWarnings("unchecked") 053 public Job(JobConf jobConf, ArrayList<?> dependingJobs) throws IOException { 054 super(new org.apache.hadoop.mapreduce.Job(jobConf), 055 (List<ControlledJob>) dependingJobs); 056 } 057 058 public Job(JobConf conf) throws IOException { 059 super(conf); 060 } 061 062 /** 063 * @return the mapred ID of this job as assigned by the mapred framework. 064 */ 065 public JobID getAssignedJobID() { 066 org.apache.hadoop.mapreduce.JobID temp = super.getMapredJobId(); 067 if (temp == null) { 068 return null; 069 } 070 return JobID.downgrade(temp); 071 } 072 073 /** 074 * @deprecated setAssignedJobID should not be called. 075 * JOBID is set by the framework. 076 */ 077 @Deprecated 078 public void setAssignedJobID(JobID mapredJobID) { 079 // do nothing 080 } 081 082 /** 083 * @return the mapred job conf of this job 084 */ 085 public synchronized JobConf getJobConf() { 086 return new JobConf(super.getJob().getConfiguration()); 087 } 088 089 090 /** 091 * Set the mapred job conf for this job. 092 * @param jobConf the mapred job conf for this job. 093 */ 094 public synchronized void setJobConf(JobConf jobConf) { 095 try { 096 super.setJob(new org.apache.hadoop.mapreduce.Job(jobConf)); 097 } catch (IOException ioe) { 098 LOG.info("Exception" + ioe); 099 } 100 } 101 102 /** 103 * @return the state of this job 104 */ 105 public synchronized int getState() { 106 State state = super.getJobState(); 107 if (state == State.SUCCESS) { 108 return SUCCESS; 109 } 110 if (state == State.WAITING) { 111 return WAITING; 112 } 113 if (state == State.RUNNING) { 114 return RUNNING; 115 } 116 if (state == State.READY) { 117 return READY; 118 } 119 if (state == State.FAILED ) { 120 return FAILED; 121 } 122 if (state == State.DEPENDENT_FAILED ) { 123 return DEPENDENT_FAILED; 124 } 125 return -1; 126 } 127 128 /** 129 * This is a no-op function, Its a behavior change from 1.x We no more can 130 * change the state from job 131 * 132 * @param state 133 * the new state for this job. 134 */ 135 @Deprecated 136 protected synchronized void setState(int state) { 137 // No-Op, we dont want to change the sate 138 } 139 140 /** 141 * Add a job to this jobs' dependency list. 142 * Dependent jobs can only be added while a Job 143 * is waiting to run, not during or afterwards. 144 * 145 * @param dependingJob Job that this Job depends on. 146 * @return <tt>true</tt> if the Job was added. 147 */ 148 public synchronized boolean addDependingJob(Job dependingJob) { 149 return super.addDependingJob(dependingJob); 150 } 151 152 /** 153 * @return the job client of this job 154 */ 155 public JobClient getJobClient() { 156 try { 157 return new JobClient(super.getJob().getConfiguration()); 158 } catch (IOException ioe) { 159 return null; 160 } 161 } 162 163 /** 164 * @return the depending jobs of this job 165 */ 166 public ArrayList<Job> getDependingJobs() { 167 return JobControl.castToJobList(super.getDependentJobs()); 168 } 169 170 /** 171 * @return the mapred ID of this job as assigned by the mapred framework. 172 */ 173 public synchronized String getMapredJobID() { 174 if (super.getMapredJobId() != null) { 175 return super.getMapredJobId().toString(); 176 } 177 return null; 178 } 179 180 /** 181 * This is no-op method for backward compatibility. It's a behavior change 182 * from 1.x, we can not change job ids from job. 183 * 184 * @param mapredJobID 185 * the mapred job ID for this job. 186 */ 187 @Deprecated 188 public synchronized void setMapredJobID(String mapredJobID) { 189 setAssignedJobID(JobID.forName(mapredJobID)); 190 } 191}