package mil.nga.giat.geowave.analytic.mapreduce.clustering.runner;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapreduce.Counters;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat;
import org.apache.hadoop.util.Tool;
import org.geotools.feature.type.BasicFeatureTypes;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.opengis.feature.simple.SimpleFeatureType;
import mil.nga.giat.geowave.adapter.vector.FeatureDataAdapter;
import mil.nga.giat.geowave.analytic.AnalyticFeature;
import mil.nga.giat.geowave.analytic.AnalyticItemWrapperFactory;
import mil.nga.giat.geowave.analytic.PropertyManagement;
import mil.nga.giat.geowave.analytic.ScopedJobConfiguration;
import mil.nga.giat.geowave.analytic.SimpleFeatureItemWrapperFactory;
import mil.nga.giat.geowave.analytic.clustering.ClusteringUtils;
import mil.nga.giat.geowave.analytic.distance.DistanceFn;
import mil.nga.giat.geowave.analytic.distance.FeatureCentroidDistanceFn;
import mil.nga.giat.geowave.analytic.distance.GeometryCentroidDistanceFn;
import mil.nga.giat.geowave.analytic.mapreduce.GeoWaveAnalyticJobRunner;
import mil.nga.giat.geowave.analytic.mapreduce.MapReduceIntegration;
import mil.nga.giat.geowave.analytic.mapreduce.SequenceFileInputFormatConfiguration;
import mil.nga.giat.geowave.analytic.mapreduce.clustering.GroupAssignmentMapReduce;
import mil.nga.giat.geowave.analytic.param.CentroidParameters;
import mil.nga.giat.geowave.analytic.param.CommonParameters;
import mil.nga.giat.geowave.analytic.param.GlobalParameters;
import mil.nga.giat.geowave.analytic.param.MapReduceParameters.MRConfig;
import mil.nga.giat.geowave.analytic.param.ParameterHelper;
import mil.nga.giat.geowave.analytic.param.StoreParameters.StoreParam;
import mil.nga.giat.geowave.analytic.store.PersistableStore;
import mil.nga.giat.geowave.core.store.GeoWaveStoreFinder;
import mil.nga.giat.geowave.core.store.memory.MemoryRequiredOptions;
import mil.nga.giat.geowave.core.store.memory.MemoryStoreFactoryFamily;
import mil.nga.giat.geowave.core.store.operations.remote.options.DataStorePluginOptions;
public class GroupAssigmentJobRunnerTest
{
final GroupAssigmentJobRunner runner = new GroupAssigmentJobRunner();
final PropertyManagement runTimeProperties = new PropertyManagement();
private static final String TEST_NAMESPACE = "test";
@Before
public void init() {
final SimpleFeatureType ftype = AnalyticFeature.createGeometryFeatureAdapter(
"centroidtest",
new String[] {
"extra1"
},
BasicFeatureTypes.DEFAULT_NAMESPACE,
ClusteringUtils.CLUSTERING_CRS).getFeatureType();
runner.setMapReduceIntegrater(new MapReduceIntegration() {
@Override
public int submit(
final Configuration configuration,
final PropertyManagement runTimeProperties,
final GeoWaveAnalyticJobRunner tool )
throws Exception {
tool.setConf(configuration);
((ParameterHelper<Object>) StoreParam.INPUT_STORE.getHelper()).setValue(
configuration,
GroupAssignmentMapReduce.class,
StoreParam.INPUT_STORE.getHelper().getValue(
runTimeProperties));
return tool.run(new String[] {});
}
@Override
public Counters waitForCompletion(
final Job job )
throws ClassNotFoundException,
IOException,
InterruptedException {
Assert.assertEquals(
SequenceFileInputFormat.class,
job.getInputFormatClass());
Assert.assertEquals(
10,
job.getNumReduceTasks());
final ScopedJobConfiguration configWrapper = new ScopedJobConfiguration(
job.getConfiguration(),
GroupAssignmentMapReduce.class);
Assert.assertEquals(
"file://foo/bin",
job.getConfiguration().get(
"mapred.input.dir"));
Assert.assertEquals(
3,
configWrapper.getInt(
CentroidParameters.Centroid.ZOOM_LEVEL,
-1));
Assert.assertEquals(
"b1234",
configWrapper.getString(
GlobalParameters.Global.PARENT_BATCH_ID,
""));
Assert.assertEquals(
"b12345",
configWrapper.getString(
GlobalParameters.Global.BATCH_ID,
""));
try {
final AnalyticItemWrapperFactory<?> wrapper = configWrapper.getInstance(
CentroidParameters.Centroid.WRAPPER_FACTORY_CLASS,
AnalyticItemWrapperFactory.class,
SimpleFeatureItemWrapperFactory.class);
Assert.assertEquals(
SimpleFeatureItemWrapperFactory.class,
wrapper.getClass());
final DistanceFn<?> distancFn = configWrapper.getInstance(
CommonParameters.Common.DISTANCE_FUNCTION_CLASS,
DistanceFn.class,
GeometryCentroidDistanceFn.class);
Assert.assertEquals(
FeatureCentroidDistanceFn.class,
distancFn.getClass());
}
catch (final InstantiationException e) {
throw new IOException(
"Unable to configure system",
e);
}
catch (final IllegalAccessException e) {
throw new IOException(
"Unable to configure system",
e);
}
return new Counters();
}
@Override
public Job getJob(
final Tool tool )
throws IOException {
return new Job(
tool.getConf());
}
@Override
public Configuration getConfiguration(
final PropertyManagement runTimeProperties )
throws IOException {
return new Configuration();
}
});
runner.setInputFormatConfiguration(new SequenceFileInputFormatConfiguration(
new Path(
"file://foo/bin")));
runner.setZoomLevel(3);
runner.setReducerCount(10);
runTimeProperties.store(
MRConfig.HDFS_BASE_DIR,
"/");
runTimeProperties.store(
GlobalParameters.Global.BATCH_ID,
"b12345");
runTimeProperties.store(
GlobalParameters.Global.PARENT_BATCH_ID,
"b1234");
runTimeProperties.store(
CommonParameters.Common.DISTANCE_FUNCTION_CLASS,
FeatureCentroidDistanceFn.class);
DataStorePluginOptions pluginOptions = new DataStorePluginOptions();
GeoWaveStoreFinder.getRegisteredStoreFactoryFamilies().put(
"memory",
new MemoryStoreFactoryFamily());
pluginOptions.selectPlugin("memory");
MemoryRequiredOptions opts = (MemoryRequiredOptions) pluginOptions.getFactoryOptions();
opts.setGeowaveNamespace(TEST_NAMESPACE);
PersistableStore store = new PersistableStore(
pluginOptions);
runTimeProperties.store(
StoreParam.INPUT_STORE,
store);
pluginOptions.createAdapterStore().addAdapter(
new FeatureDataAdapter(
ftype));
}
@Test
public void test()
throws Exception {
runner.run(runTimeProperties);
}
}