/*
* 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 static fr.ens.biologie.genomique.eoulsan.EoulsanLogger.getLogger;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.logging.Handler;
import java.util.logging.StreamHandler;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.DF;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.util.VersionInfo;
import fr.ens.biologie.genomique.eoulsan.util.LinuxCpuInfo;
import fr.ens.biologie.genomique.eoulsan.util.LinuxMemInfo;
import fr.ens.biologie.genomique.eoulsan.util.StringUtils;
/**
* Main class in Hadoop mode.
* @since 1.0
* @author Laurent Jourdren
*/
public final class MainHadoop extends Main {
private static final String LAUNCH_MODE_NAME = "hadoop";
private static final String ROOT_PATH = "/";
private static final String VAR_PATH = "/var";
private static final String TMP_PATH = "/tmp";
private Configuration conf;
@Override
protected void initializeRuntime(final Settings settings) {
this.conf =
HadoopEoulsanRuntime.newEoulsanRuntime(settings).getConfiguration();
}
@Override
protected String getHelpEoulsanCommand() {
return "hadoop jar " + Globals.APP_NAME_LOWER_CASE + ".jar";
}
@Override
protected Handler getLogHandler(final URI logFile) throws IOException {
if (logFile == null) {
throw new NullPointerException("The log file is null");
}
final Path loggerPath = new Path(logFile);
final FileSystem loggerFs = loggerPath.getFileSystem(this.conf);
final Path parentPath = loggerPath.getParent();
// Create parent directory if necessary
if (!loggerFs.exists(loggerPath.getParent())) {
if (!loggerFs.mkdirs(loggerPath.getParent())) {
throw new IOException("Unable to create directory "
+ parentPath + " for log file:" + logFile);
}
}
return new StreamHandler(loggerFs.create(loggerPath),
Globals.LOG_FORMATTER);
}
@Override
protected void sysInfoLog() {
// Log standard system properties
super.sysInfoLog();
try {
parseCpuinfo();
parseMeminfo();
df(new File(ROOT_PATH), this.conf);
df(new File(TMP_PATH), this.conf);
df(new File(VAR_PATH), this.conf);
// Log the usage of the hadoop temporary directory partition
final String hadoopTmp = this.conf.get("hadoop.tmp.dir");
if (hadoopTmp != null) {
df(new File(hadoopTmp), this.conf);
}
// Log the usage of the Java temporary directory partition
final File tmpDir = new File(System.getProperty("java.io.tmpdir"));
if (tmpDir != null && tmpDir.exists() && tmpDir.isDirectory()) {
df(tmpDir, this.conf);
}
// Log Hadoop information
HadoopInfo();
} catch (IOException e) {
getLogger()
.severe("Error while getting system information: " + e.getMessage());
}
}
/**
* Parse information from /etc/cpuinfo
* @throws IOException if an error occurs while parsing information
*/
private static void parseCpuinfo() throws IOException {
final LinuxCpuInfo cpuinfo = new LinuxCpuInfo();
final String modelName = cpuinfo.getModelName();
final String processor = cpuinfo.getProcessor();
final String cpuMHz = cpuinfo.getCPUMHz();
final String bogomips = cpuinfo.getBogoMips();
final String cores = cpuinfo.getCores();
getLogger().info(
"SYSINFO CPU model name: " + (modelName == null ? "NA" : modelName));
getLogger().info("SYSINFO CPU count: "
+ (processor == null
? "NA" : "" + (Integer.parseInt(processor.trim()) + 1)));
getLogger().info("SYSINFO CPU cores: " + (cores == null ? "NA" : cores));
getLogger().info(
"SYSINFO CPU clock: " + (cpuMHz == null ? "NA" : cpuMHz) + " MHz");
getLogger()
.info("SYSINFO Bogomips: " + (bogomips == null ? "NA" : bogomips));
}
/**
* Parse information from /etc/meminfo
* @throws IOException if an error occurs while parsing information
*/
private static void parseMeminfo() throws IOException {
final LinuxMemInfo meminfo = new LinuxMemInfo();
final String memTotal = meminfo.getMemTotal();
getLogger()
.info("SYSINFO Mem Total: " + (memTotal == null ? "NA" : memTotal));
}
/**
* Log disk free information.
* @param f file
* @param conf Hadoop configuration
* @throws IOException if an error occurs
*/
private static void df(final File f, final Configuration conf)
throws IOException {
DF df = new DF(f, conf);
getLogger().info("SYSINFO "
+ f + " " + StringUtils.sizeToHumanReadable(df.getCapacity())
+ " capacity, " + StringUtils.sizeToHumanReadable(df.getUsed())
+ " used, " + StringUtils.sizeToHumanReadable(df.getAvailable())
+ " available, " + df.getPercentUsed() + "% used");
}
/**
* Log some Hadoop information.
*/
private static void HadoopInfo() {
getLogger().info("SYSINFO Hadoop version: " + VersionInfo.getVersion());
getLogger().info("SYSINFO Hadoop revision: " + VersionInfo.getRevision());
getLogger().info("SYSINFO Hadoop date: " + VersionInfo.getDate());
getLogger().info("SYSINFO Hadoop user: " + VersionInfo.getUser());
getLogger().info("SYSINFO Hadoop url: " + VersionInfo.getUrl());
}
//
// Constructor
//
/**
* Constructor.
* @param args command line arguments
*/
protected MainHadoop(final String[] args) {
super(LAUNCH_MODE_NAME, args);
}
}