Java 尝试在shell脚本中同时运行hadoop MapReduce命令和linux命令
我有一个这样的shell脚本Java 尝试在shell脚本中同时运行hadoop MapReduce命令和linux命令,java,shell,hadoop,Java,Shell,Hadoop,我有一个这样的shell脚本 #!/bin/sh /home/hduser/Downloads/hadoop/bin/stop-all.sh echo "RUNNING HADOOP PROGRAM" cd /home/hduser/Downloads/hadoop sudo rm -R /tmp/* sudo rm -R /app/* cd sudo mkdir -p /app/hadoop/tmp sudo chown hduser:hadoop /app/hadoop/tmp sudo c
#!/bin/sh
/home/hduser/Downloads/hadoop/bin/stop-all.sh
echo "RUNNING HADOOP PROGRAM"
cd /home/hduser/Downloads/hadoop
sudo rm -R /tmp/*
sudo rm -R /app/*
cd
sudo mkdir -p /app/hadoop/tmp
sudo chown hduser:hadoop /app/hadoop/tmp
sudo chmod 750 /app/hadoop/tmp
hadoop namenode -format
/home/hduser/Downloads/hadoop/bin/start-all.sh
jps
hadoop dfs -mkdir -p ~/Downloads/hadoop/input
hadoop dfs -copyFromLocal /home/hduser/Desktop/iris.arff ~/Downloads/hadoop/input
hadoop jar ~/Desktop/try.jar 2 weka.classifiers.trees.J48 ~/Downloads/hadoop/input ~/Downloads/hadoop/output
/home/hduser/Downloads/hadoop/bin/stop-all.sh
我在java程序中调用这个脚本,如下所示
public class UIinput
{
public static void main(String[] args) throws IOException
{
// Runtime.getRuntime().exec("/home/hduser/Desktop/initial.sh");
new ProcessBuilder("/home/hduser/Desktop/initial.sh");
ProcessBuilder pb = new ProcessBuilder("/home/hduser/Desktop/initial.sh");
Process process=pb.start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
System.out.printf("Output of running %s is:",
Arrays.toString(args));
while ((line = br.readLine()) != null)
{
System.out.println(line);
}
}
}
脚本中正在执行的start all.sh、stop-all.sh和echo命令正在执行,但其他命令没有执行
Output of running [] is:no jobtracker to stop
localhost: no tasktracker to stop
no namenode to stop
localhost: no datanode to stop
localhost: no secondarynamenode to stop
RUNNING HADOOP PROGRAM
starting namenode, logging to /home/hduser/Downloads/hadoop/libexec/../logs/hadoop-hduser-namenode-ubuntu.out
localhost: starting datanode, logging to /home/hduser/Downloads/hadoop/libexec/../logs/hadoop-hduser-datanode-ubuntu.out
localhost: starting secondarynamenode, logging to /home/hduser/Downloads/hadoop/libexec/../logs/hadoop-hduser-secondarynamenode-ubuntu.out
starting jobtracker, logging to /home/hduser/Downloads/hadoop/libexec/../logs/hadoop-hduser-jobtracker-ubuntu.out
localhost: starting tasktracker, logging to /home/hduser/Downloads/hadoop/libexec/../logs/hadoop-hduser-tasktracker-ubuntu.out
stopping jobtracker
localhost: stopping tasktracker
no namenode to stop
有人能帮我吗?当我运行java代码时,我希望所有命令都在shell脚本中执行。
谢谢使用以下代码运行脚本,并在system out中查看问题详细信息
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class CommandLineExecutor {
public final int EXEC_OK = 0;
public final int EXEC_FAILED = 1;
public static void main(String[] args) {
CommandLineExecutor cmd = new CommandLineExecutor();
String[] script = new String[]{ "/home/hduser/Desktop/initial.sh"};
boolean joinToProcess = true; //Main threads waits process finished.
int result = cmd.execute(script, joinToProcess);
System.out.println( result == 0 ? "Script succesfully run" : "Script failed" );
}
public int execute(String[] cmd, boolean joinToProcess) {
Runtime runtime = Runtime.getRuntime();
Process proc = null;
try {
System.out.println("executing cmd: "+concat(cmd));
proc = runtime.exec(cmd);
StreamProcessor errorStreamProcessor = new StreamProcessor(proc.getErrorStream());
StreamProcessor outputStreamProcessor = new StreamProcessor(proc.getInputStream());
errorStreamProcessor.start();
outputStreamProcessor.start();
} catch (Exception e) {
e.printStackTrace(System.out);
return EXEC_FAILED;
}
try {
int result = EXEC_OK;
if(joinToProcess)
result = proc.waitFor();
return result;
} catch (InterruptedException e) {
System.out.println("Error at executing command: " + concat(cmd) );
e.printStackTrace(System.out);
}
return EXEC_FAILED;
}
public static String concat(String[] array) {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < array.length; i++) {
if (i > 0)
buffer.append(' ');
buffer.append(array[i]);
}
return buffer.toString();
}
class StreamProcessor extends Thread {
private InputStream inputStream;
public StreamProcessor(InputStream is) {
this.inputStream = is;
}
public void run() {
try {
InputStreamReader isr = new InputStreamReader(inputStream);
BufferedReader br = new BufferedReader(isr);
while (true) {
String s = br.readLine();
if (s == null)
break;
System.out.println(s);
}
} catch (IOException e) {
e.printStackTrace(System.out);
}
}
}
}
封装测试;
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
公共类命令行执行器{
公共最终int EXEC_OK=0;
公共最终int EXEC_失败=1;
公共静态void main(字符串[]args){
CommandLineExecutor cmd=新CommandLineExecutor();
String[]script=新字符串[]{”/home/hduser/Desktop/initial.sh“};
boolean joinToProcess=true;//主线程等待进程完成。
int result=cmd.execute(脚本,joinToProcess);
System.out.println(结果==0?“脚本成功运行”:“脚本失败”);
}
public int execute(字符串[]cmd,布尔JointProcess){
Runtime=Runtime.getRuntime();
processproc=null;
试一试{
System.out.println(“执行cmd:+concat(cmd));
proc=runtime.exec(cmd);
StreamProcessor errorStreamProcessor=新的StreamProcessor(proc.getErrorStream());
StreamProcessor outputStreamProcessor=新的StreamProcessor(proc.getInputStream());
errorStreamProcessor.start();
outputStreamProcessor.start();
}捕获(例外e){
e、 printStackTrace(系统输出);
返回EXEC_失败;
}
试一试{
int result=EXEC_OK;
if(joinToProcess)
结果=proc.waitFor();
返回结果;
}捕捉(中断异常e){
System.out.println(“执行命令时出错:“+concat(cmd));
e、 printStackTrace(系统输出);
}
返回EXEC_失败;
}
公共静态字符串concat(字符串[]数组){
StringBuffer=新的StringBuffer();
for(int i=0;i0)
buffer.append(“”);
append(数组[i]);
}
返回buffer.toString();
}
类StreamProcessor扩展线程{
私有输入流输入流;
公共流处理器(InputStream is){
this.inputStream=is;
}
公开募捐{
试一试{
InputStreamReader isr=新的InputStreamReader(inputStream);
BufferedReader br=新的BufferedReader(isr);
while(true){
字符串s=br.readLine();
如果(s==null)
打破
系统输出打印项次;
}
}捕获(IOE异常){
e、 printStackTrace(系统输出);
}
}
}
}
如果脚本失败,您可以使用process.getErrorStream()查找由于读取/使用system.err而导致的root,就像您对system.out所做的那样。我尝试了。但它没有打印任何内容。@mbsauI在给定的输出中没有看到任何错误。从技术上讲,所有命令都应该从脚本执行。脚本执行时是否看到任何错误?没有错误。但是脚本中有几行没有执行。我逐个脚本检查了脚本。除了启动和停止脚本以及回显之外,没有其他命令executed@srassudo可能是命令造成的。若你们能以root用户身份运行程序,你们就可以运行java程序。别忘了在脚本中删除sudo。顺便问一下,hduser可以在shell上运行jps吗?很少有命令显示此错误/home/hduser/Desktop/initial.sh:13:/home/hduser/Desktop/initial.sh:jps:not found/home/hduser/Desktop/initial.sh:14:/home/hduser/Desktop/initial.sh:hadoop:not found从root用户运行java。据我所知,java代码没有执行命令的权限