package com.github.martinprillard.shavadoop.master;
import java.io.InterruptedIOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import com.github.martinprillard.shavadoop.network.FileTransfert;
import com.github.martinprillard.shavadoop.network.SSHManager;
import com.github.martinprillard.shavadoop.network.ShellThread;
import com.github.martinprillard.shavadoop.slave.Slave;
import com.github.martinprillard.shavadoop.util.Constant;
import org.apache.commons.io.FilenameUtils;
import com.jcabi.ssh.SSH;
import com.jcabi.ssh.Shell;
/**
*
* @author martin prillard
*
*/
public class LaunchShufflingMap extends ShellThread {
private String hostMapper;
private String idWorker;
private String nbWorker;
public LaunchShufflingMap(SSHManager _sm, String _nbWorker, String _distantHost, String _shufflingDictionaryFile, String _hostMapper, String _idWorker) {
super(_sm, _distantHost, _shufflingDictionaryFile);
nbWorker = _nbWorker;
hostMapper = _hostMapper;
idWorker = _idWorker;
}
@Override
public void interrupt() {
super.interrupt();
}
public void run() {
try {
String pathJar = Constant.PATH_JAR_MASTER;
String method = Slave.SHUFFLING_MAP_FUNCTION;
// execute on the master
if (sm.isLocal(distantHost)) {
// Run a java app in a separate system process
String cmd = getCmdJar(pathJar, nbWorker, hostMapper, method, fileToTreat, idWorker);
Process p = Runtime.getRuntime().exec(cmd);
if (Constant.MODE_DEBUG)
System.out.println("On local : " + cmd);
p.waitFor();
p.destroy();
// execute on a distant computer
} else {
ExecutorService es = Executors.newCachedThreadPool();
// connect to the distant computer
shell = new SSH(distantHost, shellPort, Constant.USERNAME, dsaKey);
// master file DSM -> slave
String destFile = Constant.PATH_REPO_RES + FilenameUtils.getBaseName(fileToTreat);
es.execute(new FileTransfert(sm, distantHost, fileToTreat, destFile, true, false));
fileToTreat = destFile;
String cmd = getCmdJar(pathJar, nbWorker, hostMapper, method, fileToTreat, idWorker);
es.shutdown();
try {
es.awaitTermination(Constant.THREAD_MAX_LIFETIME, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}
// launch map process
new Shell.Plain(shell).exec(cmd);
if (Constant.MODE_DEBUG)
System.out.println("On " + distantHost + " : " + cmd);
}
} catch (InterruptedIOException e) { // if thread was interrupted
Thread.currentThread().interrupt();
if (Constant.MODE_DEBUG)
System.out.println("TASK_TRACKER : worker failed was interrupted");
} catch (Exception e) {
if (!isInterrupted()) { // if other exceptions
System.out.println("Fail to launch shavadoop slave from " + distantHost + " : " + e.getMessage());
} else {
if (Constant.MODE_DEBUG)
System.out.println("TASK_TRACKER : worker failed was interrupted");
}
}
}
}