package mil.nga.giat.geowave.test.mapreduce; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import mil.nga.giat.geowave.core.cli.parser.ManualOperationParams; import mil.nga.giat.geowave.core.ingest.operations.LocalToMapReduceToGeowaveCommand; import mil.nga.giat.geowave.core.ingest.operations.options.IngestFormatPluginOptions; import mil.nga.giat.geowave.core.store.operations.remote.options.DataStorePluginOptions; import mil.nga.giat.geowave.core.store.operations.remote.options.IndexPluginOptions; import mil.nga.giat.geowave.test.TestUtils.DimensionalityType; public class MapReduceTestUtils { private final static Logger LOGGER = LoggerFactory.getLogger(MapReduceTestUtils.class); public static final String EXPECTED_RESULTS_KEY = "EXPECTED_RESULTS"; public static final int MIN_INPUT_SPLITS = 3; public static final int MAX_INPUT_SPLITS = 5; protected static void testMapReduceIngest( final DataStorePluginOptions dataStore, final DimensionalityType dimensionalityType, final String ingestFilePath ) { testMapReduceIngest( dataStore, dimensionalityType, "gpx", ingestFilePath); } protected static void testMapReduceIngest( final DataStorePluginOptions dataStore, final DimensionalityType dimensionalityType, final String format, final String ingestFilePath ) { // ingest gpx data directly into GeoWave using the // ingest framework's main method and pre-defined commandline arguments LOGGER.warn("Ingesting '" + ingestFilePath + "' - this may take several minutes..."); final Thread progressLogger = startProgressLogger(); // Indexes final String[] indexTypes = dimensionalityType.getDimensionalityArg().split( ","); final List<IndexPluginOptions> indexOptions = new ArrayList<IndexPluginOptions>( indexTypes.length); for (final String indexType : indexTypes) { final IndexPluginOptions indexOption = new IndexPluginOptions(); indexOption.selectPlugin(indexType); indexOptions.add(indexOption); } // Ingest Formats final IngestFormatPluginOptions ingestFormatOptions = new IngestFormatPluginOptions(); ingestFormatOptions.selectPlugin(format); final LocalToMapReduceToGeowaveCommand mrGw = new LocalToMapReduceToGeowaveCommand(); mrGw.setInputIndexOptions(indexOptions); mrGw.setInputStoreOptions(dataStore); mrGw.setPluginFormats(ingestFormatOptions); final MapReduceTestEnvironment env = MapReduceTestEnvironment.getInstance(); mrGw.setParameters( ingestFilePath, env.getHdfs(), env.getHdfsBaseDirectory(), null, null); mrGw.getMapReduceOptions().setJobTrackerHostPort( env.getJobtracker()); mrGw.execute(new ManualOperationParams()); progressLogger.interrupt(); } private static Thread startProgressLogger() { final Runnable r = new Runnable() { @Override public void run() { final long start = System.currentTimeMillis(); try { while (true) { final long now = System.currentTimeMillis(); LOGGER.warn("Ingest running, progress: " + ((now - start) / 1000) + "s."); Thread.sleep(60000); } } catch (final InterruptedException e) { // Do nothing; thread is designed to be interrupted when // ingest completes } } }; final Thread t = new Thread( r); t.start(); return t; } public static void filterConfiguration( final Configuration conf ) { // final parameters, can't be overriden conf.unset("mapreduce.job.end-notification.max.retry.interval"); conf.unset("mapreduce.job.end-notification.max.attempts"); // deprecated parameters (added in by default since we used the // Configuration() constructor (everything is set)) conf.unset("session.id"); conf.unset("mapred.jar"); conf.unset("fs.default.name"); conf.unset("mapred.map.tasks.speculative.execution"); conf.unset("mapred.reduce.tasks"); conf.unset("mapred.reduce.tasks.speculative.execution"); conf.unset("mapred.mapoutput.value.class"); conf.unset("mapred.used.genericoptionsparser"); conf.unset("mapreduce.map.class"); conf.unset("mapred.job.name"); conf.unset("mapreduce.inputformat.class"); conf.unset("mapred.input.dir"); conf.unset("mapreduce.outputformat.class"); conf.unset("mapred.map.tasks"); conf.unset("mapred.mapoutput.key.class"); conf.unset("mapred.working.dir"); } public static Configuration getConfiguration() { final Configuration conf = new Configuration(); final MapReduceTestEnvironment env = MapReduceTestEnvironment.getInstance(); conf.set( "fs.defaultFS", env.getHdfs()); conf.set( "fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName()); conf.set( "mapreduce.jobtracker.address", env.getJobtracker()); filterConfiguration(conf); return conf; } }