package fr.ens.biologie.genomique.eoulsan.util.hadoop;
import static com.google.common.base.Preconditions.checkNotNull;
import static fr.ens.biologie.genomique.eoulsan.CommonHadoop.createConfiguration;
import static fr.ens.biologie.genomique.eoulsan.EoulsanLogger.getLogger;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobID;
import org.apache.hadoop.mapred.RunningJob;
import org.apache.hadoop.mapreduce.Job;
import fr.ens.biologie.genomique.eoulsan.core.workflow.EmergencyStopTask;
import fr.ens.biologie.genomique.eoulsan.core.workflow.EmergencyStopTasks;
/**
* This class define an EmergencyStopTask for Hadoop Jobs.
* @author Laurent Jourdren
* @since 2.0
*/
public class HadoopJobEmergencyStopTask implements EmergencyStopTask {
private final String jobId;
@Override
public void stop() {
getLogger().info("Try to kill " + this.jobId + " Hadoop job");
// Create configuration object
final Configuration conf = createConfiguration();
try {
final JobClient client = new JobClient(conf);
if (client != null) {
final RunningJob job = client.getJob(JobID.forName(this.jobId));
if (job != null) {
job.killJob();
}
}
} catch (IOException e) {
getLogger().severe(e.getMessage());
}
getLogger().info("Hadoop job " + this.jobId + " killed");
}
//
// Object tasks
//
@Override
public int hashCode() {
return this.jobId.hashCode();
}
@Override
public boolean equals(final Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof HadoopJobEmergencyStopTask)) {
return false;
}
final HadoopJobEmergencyStopTask that = (HadoopJobEmergencyStopTask) obj;
return this.jobId.equals(that.jobId);
}
//
// Static method
//
/**
* Add an Hadoop Job to the EmergencyStopTasks.
* @param job the Hadoop job
* @throws IOException if an error occurs while getting the job id
* @throws InterruptedException if an error occurs while getting the job id
*/
public static void addHadoopJobEmergencyStopTask(final Job job)
throws IOException, InterruptedException {
EmergencyStopTasks.getInstance().add(new HadoopJobEmergencyStopTask(job));
}
/**
* Remove an Hadoop Job to the EmergencyStopTasks.
* @param job the Hadoop job
* @throws IOException if an error occurs while getting the job id
* @throws InterruptedException if an error occurs while getting the job id
*/
public static void removeHadoopJobEmergencyStopTask(final Job job)
throws IOException, InterruptedException {
EmergencyStopTasks.getInstance()
.remove(new HadoopJobEmergencyStopTask(job));
}
//
// Constructor
//
/**
* Public constructor.
* @param job the Hadoop job
* @throws IOException if an error occurs while getting the job id
* @throws InterruptedException if an error occurs while getting the job id
*/
public HadoopJobEmergencyStopTask(final Job job)
throws IOException, InterruptedException {
checkNotNull(job, "job argument cannot be null");
this.jobId = job.getStatus().getJobID().toString();
}
}