/*
* Eoulsan development code
*
* This code may be freely distributed and modified under the
* terms of the GNU Lesser General Public License version 2.1 or
* later and CeCILL-C. This should be distributed with the code.
* If you do not have a copy, see:
*
* http://www.gnu.org/licenses/lgpl-2.1.txt
* http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.txt
*
* Copyright for this code is held jointly by the Genomic platform
* of the Institut de Biologie de l'École normale supérieure and
* the individual authors. These should be listed in @author doc
* comments.
*
* For more information on the Eoulsan project and its aims,
* or to join the Eoulsan Google group, visit the home page
* at:
*
* http://outils.genomique.biologie.ens.fr/eoulsan
*
*/
package fr.ens.biologie.genomique.eoulsan;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
/**
* This class define the Runtime to execute low level IO operation for Eoulsan
* in Hadoop mode.
* @since 1.0
* @author Laurent Jourdren
*/
public final class HadoopEoulsanRuntime extends AbstractEoulsanRuntime {
private static final String HADOOP_TEMP_DIR = "mapreduce.cluster.temp.dir";
private final Configuration conf;
private final EoulsanExecMode mode;
/**
* Get Hadoop configuration.
* @return Hadoop Configuration object
*/
public Configuration getConfiguration() {
return this.conf;
}
//
// EoulsanRuntime methods
//
@Override
public EoulsanExecMode getMode() {
return mode;
}
@Override
public File getTempDirectory() {
// In Hadoop task mode do not use Eoulsan settings to get the temporary
// directory as it often does not exists
if (this.mode == EoulsanExecMode.HADOOP_TASK) {
// Use Hadoop temporary directory if defined or the default JVM
// temporary directory
return new File(
this.conf.get(HADOOP_TEMP_DIR, System.getProperty("java.io.tmpdir")));
}
return getSettings().getTempDirectoryFile();
}
@Override
public InputStream getInputStream(final String dataSource)
throws IOException {
if (dataSource == null) {
throw new IllegalArgumentException("The datasource is null.");
}
final Path p = new Path(dataSource);
final FileSystem fs = p.getFileSystem(this.conf);
return decompressInputStreamIsNeeded(fs.open(p), dataSource);
}
@Override
public InputStream getRawInputStream(final String dataSource)
throws IOException {
if (dataSource == null) {
throw new IllegalArgumentException("The datasource is null.");
}
final Path p = new Path(dataSource);
final FileSystem fs = p.getFileSystem(this.conf);
return fs.open(p);
}
@Override
public OutputStream getOutputStream(final String dataSource)
throws IOException {
if (dataSource == null) {
throw new IllegalArgumentException("The datasource is null.");
}
final Path p = new Path(dataSource);
final FileSystem fs = p.getFileSystem(this.conf);
return fs.create(p);
}
//
// Constructor
//
/**
* Public constructor, initialize the runtime. This constructor is useful in
* mappers or reducers for initialize Eoulsan DataProtocols.
* @param conf Hadoop configuration of the application
*/
public static HadoopEoulsanRuntime newEoulsanRuntime(final Configuration conf)
throws IOException {
try {
return newEoulsanRuntime(new Settings(false), conf,
EoulsanExecMode.HADOOP_TASK);
} catch (EoulsanException e) {
throw new IOException(e);
}
}
/**
* Package constructor, initialize the runtime. This constructor can only
* called by MainHadoop class.
*/
static HadoopEoulsanRuntime newEoulsanRuntime(final Settings settings) {
// Create Hadoop configuration object
final Configuration conf = CommonHadoop.createConfiguration(settings);
// Initialize runtime
return newEoulsanRuntime(settings, conf, EoulsanExecMode.HADOOP);
}
/**
* Private constructor, initialize the runtime.
* @param settings Settings of the application
* @param conf Hadoop configuration object
*/
private static synchronized HadoopEoulsanRuntime newEoulsanRuntime(
final Settings settings, final Configuration conf,
final EoulsanExecMode mode) {
// Create instance
final HadoopEoulsanRuntime instance =
new HadoopEoulsanRuntime(settings, conf, mode);
// Set the instance
EoulsanRuntime.setInstance(instance, true);
return (HadoopEoulsanRuntime) EoulsanRuntime.getRuntime();
}
/**
* Private constructor.
* @param settings Settings of the application
* @param conf Hadoop configuration object
*/
private HadoopEoulsanRuntime(final Settings settings,
final Configuration conf, final EoulsanExecMode mode) {
super(settings);
if (conf == null) {
throw new IllegalArgumentException("The configuration is null");
}
this.conf = conf;
this.mode = mode;
}
}