package mil.nga.giat.geowave.analytic.mapreduce;
import java.io.IOException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import mil.nga.giat.geowave.analytic.IndependentJobRunner;
import mil.nga.giat.geowave.analytic.PropertyManagement;
import mil.nga.giat.geowave.analytic.param.MapReduceParameters;
import mil.nga.giat.geowave.analytic.param.ParameterEnum;
import org.apache.hadoop.conf.Configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Run a series of jobs in a sequence. Use the {@link PostOperationTask} to
* allow job definitions to perform an action after running. The purpose of this
* added task is to support information from a prior job in the sequence(such as
* temporary file names, job IDs, stats) to be provided to the next job or set
* of jobs.
*
*/
public class MapReduceJobController implements
MapReduceJobRunner,
IndependentJobRunner
{
final static Logger LOGGER = LoggerFactory.getLogger(MapReduceJobController.class);
private MapReduceJobRunner[] runners;
private PostOperationTask[] runSetUpTasks;
public MapReduceJobController() {}
protected void init(
final MapReduceJobRunner[] runners,
final PostOperationTask[] runSetUpTasks ) {
this.runners = runners;
this.runSetUpTasks = runSetUpTasks;
}
public MapReduceJobRunner[] getRunners() {
return runners;
}
public static interface PostOperationTask
{
public void runTask(
Configuration config,
MapReduceJobRunner runner );
}
public static final PostOperationTask DoNothingTask = new PostOperationTask() {
@Override
public void runTask(
final Configuration config,
final MapReduceJobRunner runner ) {}
};
@Override
public int run(
final Configuration config,
final PropertyManagement runTimeProperties )
throws Exception {
for (int i = 0; i < runners.length; i++) {
final MapReduceJobRunner runner = runners[i];
LOGGER.info("Running " + runner.getClass().toString());
final int status = runner.run(
config,
runTimeProperties);
if (status != 0) {
return status;
}
runSetUpTasks[i].runTask(
config,
runner);
}
return 0;
}
@Override
public Collection<ParameterEnum<?>> getParameters() {
final Set<ParameterEnum<?>> params = new HashSet<ParameterEnum<?>>();
params.addAll(MapReduceParameters.getParameters());
for (int i = 0; i < runners.length; i++) {
final MapReduceJobRunner runner = runners[i];
if (runner instanceof IndependentJobRunner) {
params.addAll(((IndependentJobRunner) runner).getParameters());
}
}
return params;
}
@Override
public int run(
final PropertyManagement runTimeProperties )
throws Exception {
return this.run(
getConfiguration(runTimeProperties),
runTimeProperties);
}
public static Configuration getConfiguration(
final PropertyManagement pm )
throws IOException {
return new HadoopOptions(
pm).getConfiguration();
}
}