package mil.nga.giat.geowave.analytic.mapreduce.clustering.runner; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.io.ObjectWritable; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Reducer; import mil.nga.giat.geowave.analytic.PropertyManagement; import mil.nga.giat.geowave.analytic.clustering.CentroidManagerGeoWave; import mil.nga.giat.geowave.analytic.clustering.NestedGroupCentroidAssignment; import mil.nga.giat.geowave.analytic.mapreduce.GeoWaveAnalyticJobRunner; import mil.nga.giat.geowave.analytic.mapreduce.clustering.GroupAssignmentMapReduce; import mil.nga.giat.geowave.analytic.param.CentroidParameters; import mil.nga.giat.geowave.analytic.param.GlobalParameters; import mil.nga.giat.geowave.analytic.param.MapReduceParameters; import mil.nga.giat.geowave.analytic.param.ParameterEnum; import mil.nga.giat.geowave.analytic.param.StoreParameters; import mil.nga.giat.geowave.analytic.param.StoreParameters.StoreParam; import mil.nga.giat.geowave.analytic.store.PersistableStore; import mil.nga.giat.geowave.core.store.operations.remote.options.DataStorePluginOptions; import mil.nga.giat.geowave.mapreduce.input.GeoWaveInputFormat; import mil.nga.giat.geowave.mapreduce.input.GeoWaveInputKey; /** * * Assign group IDs to input items based on centroids. * * */ public class GroupAssigmentJobRunner extends GeoWaveAnalyticJobRunner { private int zoomLevel = 1; public GroupAssigmentJobRunner() { super.setReducerCount(8); } public void setZoomLevel( final int zoomLevel ) { this.zoomLevel = zoomLevel; } @Override public void configure( final Job job ) throws Exception { job.setMapperClass(GroupAssignmentMapReduce.GroupAssignmentMapper.class); job.setMapOutputKeyClass(GeoWaveInputKey.class); job.setMapOutputValueClass(ObjectWritable.class); job.setReducerClass(Reducer.class); job.setOutputKeyClass(GeoWaveInputKey.class); job.setOutputValueClass(ObjectWritable.class); } @Override public Class<?> getScope() { return GroupAssignmentMapReduce.class; } @Override public int run( final Configuration config, final PropertyManagement runTimeProperties ) throws Exception { // Required since the Mapper uses the input format parameters to lookup // the adapter final DataStorePluginOptions dataStoreOptions = ((PersistableStore) runTimeProperties .getProperty(StoreParam.INPUT_STORE)).getDataStoreOptions(); GeoWaveInputFormat.setStoreOptions( config, dataStoreOptions); runTimeProperties.setConfig( new ParameterEnum[] { CentroidParameters.Centroid.EXTRACTOR_CLASS, CentroidParameters.Centroid.WRAPPER_FACTORY_CLASS, }, config, GroupAssignmentMapReduce.class); NestedGroupCentroidAssignment.setParameters( config, getScope(), runTimeProperties); CentroidManagerGeoWave.setParameters( config, getScope(), runTimeProperties); NestedGroupCentroidAssignment.setZoomLevel( config, getScope(), zoomLevel); return super.run( config, runTimeProperties); } @Override public Collection<ParameterEnum<?>> getParameters() { final Set<ParameterEnum<?>> params = new HashSet<ParameterEnum<?>>(); params.addAll(super.getParameters()); params.addAll(Arrays.asList(new ParameterEnum<?>[] { StoreParameters.StoreParam.INPUT_STORE, GlobalParameters.Global.BATCH_ID })); params.addAll(CentroidManagerGeoWave.getParameters()); params.addAll(MapReduceParameters.getParameters()); params.addAll(NestedGroupCentroidAssignment.getParameters()); return params; } @Override protected String getJobName() { return "Group Assignment"; } }