Runtime.getRuntime().exec() 执行sparksubmit 返回状态返回127是什么原因?怎么解决?

Runtime.getRuntime().exec() 执行sparksubmit 返回状态返回127是什么原因?怎么解决?

String command = "sh "+"/usr/hdp/3.1.5.0-152/spark2/bin/spark-submit "+"--driver-class-path /usr/share/java/mysql-connector-java.jar "+"--jars /usr/share/java/mysql-connector-java.jar "+"--master yarn "+"--driver-cores 5 "+"--driver-memory 512m "+"--executor-memory 512m "+"--executor-cores 4 "+"--class com.hrong.job.etl.JobTest /data/SparkJars/spark-job.jar ";

命令行打印出来在服务器上执行没问题,在Spring boot 中执行 status = proc.exitValue(); status返回127,这是什么原因?

代码如下所示:
public static int EtlJobTest() throws IOException, InterruptedException {

    //SparkAppHandle handler = new SparkLauncher(env).setAppName(appName)
    Process proc = null;
    BufferedReader br = null;
    OutputStream os = null;
    int status = 0;

    String[] argss = new String[]{
            "spark-submit \\",
            "--driver-class-path /usr/share/java/mysql-connector-java.jar \\",
            "--jars /usr/share/java/mysql-connector-java.jar \\",
            "--master yarn \\",
            "--driver-cores 5 \\",
            "--driver-memory 512m \\",
            "--executor-memory 512m \\",
            "--executor-cores 4 \\",
            "--class com.hrong.job.etl.JobTest /data/SparkJars/spark-job.jar "
    };

    String[] argsss = new String[] {
            "sh",
            "/usr/hdp/3.1.5.0-152/spark2/bin/spark-submit ", ///src/main/datax/bin
            "--driver-class-path /usr/share/java/mysql-connector-java.jar  "
    };
    String command = "sh "+"/usr/hdp/3.1.5.0-152/spark2/bin/spark-submit "+"--driver-class-path /usr/share/java/mysql-connector-java.jar  "+"--jars /usr/share/java/mysql-connector-java.jar  "+"--master yarn  "+"--driver-cores 5  "+"--driver-memory 512m  "+"--executor-memory 512m  "+"--executor-cores 4  "+"--class com.hrong.job.etl.JobTest /data/SparkJars/spark-job.jar ";
    proc = Runtime.getRuntime().exec(argsss);
    Thread.sleep(1000);
    status = proc.exitValue();
    
    br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
    os = new FileOutputStream("/data/ruoyi/logs/temp.log");
    String result;
    while ((result = br.readLine()) != null) {
        byte[] data = (result+"\n").getBytes();
        os.write(data);

        System.out.println(result);
    }
    br.close();
    os.close();
    Thread.sleep(1000);
    status = proc.exitValue();
    
    return status;
}

执行结果如下:

++++++++++++++++++++++++

sh /usr/hdp/3.1.5.0-152/spark2/bin/spark-submit --driver-class-path /usr/share/java/mysql-connector-java.jar --jars /usr/share/java/mysql-connector-java.jar --master yarn --driver-cores 5 --driver-memory 512m --executor-memory 512m --executor-cores 4 --class com.hrong.job.etl.JobTest /data/SparkJars/spark-job.jar

127

Runtime.getRuntime().exec() 是否可以执行sparksumbit?

可以,Runtime.exec() 不是cmd或shell环境,因此无法直接调用dir等命令,需要在程序中读取运行的操作系统平台,以调用不同的命令解释器(NT:cmd.exe,windows 95/98:command.exe,linux:/bin/sh)。
猜测

String[] argsss = new String[] {
            "sh",
            "/usr/hdp/3.1.5.0-152/spark2/bin/spark-submit ", ///src/main/datax/bin
            "--driver-class-path /usr/share/java/mysql-connector-java.jar  "
    };
    修改一下:
String[] argsss = new String[] {
            "/bin/sh",   
            "/usr/hdp/3.1.5.0-152/spark2/bin/spark-submit ", ///src/main/datax/bin
            "--driver-class-path /usr/share/java/mysql-connector-java.jar  "
    };