WJC_SX 2022-12-05 08:35 采纳率: 95%
浏览 21
已结题

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?

  • 写回答

1条回答 默认 最新

  • AllenGd 大数据领域优质创作者 2022-12-05 11:54
    关注

    可以,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  "
        };
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月15日
  • 已采纳回答 12月7日
  • 创建了问题 12月5日

悬赏问题

  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示