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 mil.nga.giat.geowave.analytic.PropertyManagement; import mil.nga.giat.geowave.analytic.SimpleFeatureProjection; 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.GeoWaveOutputFormatConfiguration; import mil.nga.giat.geowave.analytic.mapreduce.clustering.ConvexHullMapReduce; import mil.nga.giat.geowave.analytic.param.CentroidParameters; import mil.nga.giat.geowave.analytic.param.GlobalParameters; import mil.nga.giat.geowave.analytic.param.HullParameters; 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.core.geotime.ingest.SpatialDimensionalityTypeProvider; import mil.nga.giat.geowave.mapreduce.input.GeoWaveInputKey; import mil.nga.giat.geowave.mapreduce.output.GeoWaveOutputKey; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.io.ObjectWritable; import org.apache.hadoop.mapreduce.Job; /** * */ public class ConvexHullJobRunner extends GeoWaveAnalyticJobRunner { private int zoomLevel = 1; public ConvexHullJobRunner() { super.setOutputFormatConfiguration(new GeoWaveOutputFormatConfiguration()); } public void setZoomLevel( final int zoomLevel ) { this.zoomLevel = zoomLevel; } @Override public void configure( final Job job ) throws Exception { job.setMapperClass(ConvexHullMapReduce.ConvexHullMap.class); job.setMapOutputKeyClass(GeoWaveInputKey.class); job.setMapOutputValueClass(ObjectWritable.class); job.setReducerClass(ConvexHullMapReduce.ConvexHullReducer.class); job.setReduceSpeculativeExecution(false); job.setOutputKeyClass(GeoWaveOutputKey.class); job.setOutputValueClass(Object.class); } @Override public Class<?> getScope() { return ConvexHullMapReduce.class; } @Override public int run( final Configuration config, final PropertyManagement runTimeProperties ) throws Exception { runTimeProperties.storeIfEmpty( HullParameters.Hull.PROJECTION_CLASS, SimpleFeatureProjection.class); runTimeProperties.setConfig( new ParameterEnum<?>[] { HullParameters.Hull.WRAPPER_FACTORY_CLASS, HullParameters.Hull.PROJECTION_CLASS, HullParameters.Hull.DATA_TYPE_ID, HullParameters.Hull.INDEX_ID }, config, getScope()); setReducerCount(runTimeProperties.getPropertyAsInt( HullParameters.Hull.REDUCER_COUNT, 4)); CentroidManagerGeoWave.setParameters( config, getScope(), runTimeProperties); NestedGroupCentroidAssignment.setParameters( config, getScope(), runTimeProperties); final int localZoomLevel = runTimeProperties.getPropertyAsInt( CentroidParameters.Centroid.ZOOM_LEVEL, zoomLevel); // getting group from next level, now that the prior level is complete NestedGroupCentroidAssignment.setZoomLevel( config, getScope(), localZoomLevel + 1); addDataAdapter( config, getAdapter( runTimeProperties, HullParameters.Hull.DATA_TYPE_ID, HullParameters.Hull.DATA_NAMESPACE_URI)); checkIndex( runTimeProperties, HullParameters.Hull.INDEX_ID, new SpatialDimensionalityTypeProvider().createPrimaryIndex().getId().getString()); 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, StoreParameters.StoreParam.OUTPUT_STORE, GlobalParameters.Global.BATCH_ID })); params.addAll(MapReduceParameters.getParameters()); params.addAll(NestedGroupCentroidAssignment.getParameters()); params.addAll(Arrays.asList(new ParameterEnum<?>[] { HullParameters.Hull.WRAPPER_FACTORY_CLASS, HullParameters.Hull.PROJECTION_CLASS, HullParameters.Hull.REDUCER_COUNT, HullParameters.Hull.DATA_TYPE_ID, HullParameters.Hull.DATA_NAMESPACE_URI, HullParameters.Hull.INDEX_ID })); return params; } @Override protected String getJobName() { return "Convex Hull"; } }