package mil.nga.giat.geowave.analytic.mapreduce.nn;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import mil.nga.giat.geowave.analytic.AdapterWithObjectWritable;
import mil.nga.giat.geowave.analytic.PropertyManagement;
import mil.nga.giat.geowave.analytic.mapreduce.GeoWaveAnalyticJobRunner;
import mil.nga.giat.geowave.analytic.mapreduce.nn.NNMapReduce.PartitionDataWritable;
import mil.nga.giat.geowave.analytic.mapreduce.nn.NNMapReduce.PassthruPartitioner;
import mil.nga.giat.geowave.analytic.param.CommonParameters;
import mil.nga.giat.geowave.analytic.param.ParameterEnum;
import mil.nga.giat.geowave.analytic.param.PartitionParameters.Partition;
import mil.nga.giat.geowave.analytic.partitioner.OrthodromicDistancePartitioner;
import mil.nga.giat.geowave.analytic.partitioner.Partitioner;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
public class NNJobRunner extends
GeoWaveAnalyticJobRunner
{
@Override
public void configure(
final Job job )
throws Exception {
job.setMapperClass(NNMapReduce.NNMapper.class);
job.setReducerClass(NNMapReduce.NNSimpleFeatureIDOutputReducer.class);
job.setMapOutputKeyClass(PartitionDataWritable.class);
job.setMapOutputValueClass(AdapterWithObjectWritable.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setSpeculativeExecution(false);
}
@Override
public Class<?> getScope() {
return NNMapReduce.class;
}
@Override
public int run(
final Configuration config,
final PropertyManagement runTimeProperties )
throws Exception {
final Partitioner<?> partitioner = runTimeProperties.getClassInstance(
Partition.PARTITIONER_CLASS,
Partitioner.class,
OrthodromicDistancePartitioner.class);
final Partitioner<?> secondaryPartitioner = runTimeProperties.getClassInstance(
Partition.SECONDARY_PARTITIONER_CLASS,
Partitioner.class,
PassthruPartitioner.class);
partitioner.setup(
runTimeProperties,
getScope(),
config);
if (secondaryPartitioner.getClass() != partitioner.getClass()) {
secondaryPartitioner.setup(
runTimeProperties,
getScope(),
config);
}
runTimeProperties.setConfig(
new ParameterEnum[] {
Partition.PARTITIONER_CLASS,
Partition.SECONDARY_PARTITIONER_CLASS,
Partition.MAX_DISTANCE,
Partition.MAX_MEMBER_SELECTION,
Partition.GEOMETRIC_DISTANCE_UNIT,
Partition.DISTANCE_THRESHOLDS,
CommonParameters.Common.DISTANCE_FUNCTION_CLASS
},
config,
getScope());
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<?>[] {
Partition.PARTITIONER_CLASS,
Partition.MAX_DISTANCE,
Partition.SECONDARY_PARTITIONER_CLASS,
Partition.MAX_MEMBER_SELECTION,
Partition.GEOMETRIC_DISTANCE_UNIT,
Partition.DISTANCE_THRESHOLDS,
CommonParameters.Common.DISTANCE_FUNCTION_CLASS
}));
return params;
}
@Override
protected String getJobName() {
return "Nearest Neighbors";
}
}