package mil.nga.giat.geowave.mapreduce; import org.apache.commons.cli.ParseException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.util.Tool; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import mil.nga.giat.geowave.core.store.operations.remote.options.DataStorePluginOptions; import mil.nga.giat.geowave.core.store.query.DistributableQuery; import mil.nga.giat.geowave.core.store.query.QueryOptions; import mil.nga.giat.geowave.mapreduce.input.GeoWaveInputFormat; import mil.nga.giat.geowave.mapreduce.output.GeoWaveOutputFormat; /** * This class can run a basic job to query GeoWave. It manages datastore * connection params, adapters, indices, query, min splits and max splits. */ public abstract class AbstractGeoWaveJobRunner extends Configured implements Tool { protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractGeoWaveJobRunner.class); protected DataStorePluginOptions dataStoreOptions; protected DistributableQuery query = null; protected QueryOptions queryOptions; protected Integer minInputSplits = null; protected Integer maxInputSplits = null; public AbstractGeoWaveJobRunner( final DataStorePluginOptions dataStoreOptions ) { this.dataStoreOptions = dataStoreOptions; } /** * Main method to execute the MapReduce analytic. */ public int runJob() throws Exception { final Job job = Job.getInstance(super.getConf()); // must use the assembled job configuration final Configuration conf = job.getConfiguration(); GeoWaveInputFormat.setStoreOptions( conf, dataStoreOptions); GeoWaveOutputFormat.setStoreOptions( conf, dataStoreOptions); job.setJarByClass(this.getClass()); configure(job); if (queryOptions != null) { GeoWaveInputFormat.setQueryOptions( conf, queryOptions); } if (query != null) { GeoWaveInputFormat.setQuery( conf, query); } if (minInputSplits != null) { GeoWaveInputFormat.setMinimumSplitCount( conf, minInputSplits); } if (maxInputSplits != null) { GeoWaveInputFormat.setMaximumSplitCount( conf, maxInputSplits); } final boolean jobSuccess = job.waitForCompletion(true); return (jobSuccess) ? 0 : 1; } protected abstract void configure( Job job ) throws Exception; public void setMaxInputSplits( final int maxInputSplits ) { this.maxInputSplits = maxInputSplits; } public void setMinInputSplits( final int minInputSplits ) { this.minInputSplits = minInputSplits; } public void setQueryOptions( final QueryOptions options ) { queryOptions = options; } public void setQuery( final DistributableQuery query ) { this.query = query; } @Override public int run( final String[] args ) throws Exception { return runOperation(args) ? 0 : -1; } public boolean runOperation( final String[] args ) throws ParseException { try { return runJob() == 0 ? true : false; } catch (final Exception e) { LOGGER.error( "Unable to run job", e); throw new ParseException( e.getMessage()); } } }