使用Runtime.getRuntime()。exec提交时找不到spark-submit命令

时间:2019-06-07 11:00:59

标签: java apache-spark

我有一个用例,需要从Java应用程序提交python代码。我为相同的代码编写了以下代码:

    String command = "spark-submit /home/hadoop/sample.py "
            + "--input_dir " + getTmpModelInputPath() + "/* " + "--output_dir " + getTmpModelOutputPath();

    final String[] arr = { "/bin/sh", "-c", command};

    Process p = Runtime.getRuntime().exec(arr);

    try {
        int exitVal = p.waitFor();
    } catch (InterruptedException e) {
        e.printStackTrace();
        throw new RuntimeException("job failed");
    }

命令失败,找不到“ spark-sumit”。当我直接在主节点上运行命令字符串时,它可以正常工作。有人知道这是怎么回事吗?

1 个答案:

答案 0 :(得分:0)

我能够从根本原因导致命令未找到错误。主应用程序的spark-submit是在集群模式下启动的。因此,用Java代码完成的spark-submit是在“执行程序节点”上执行的,而不是在主节点上执行的。执行程序节点在主机上没有可用的spark-submit。

如果我们以客户端模式提交主应用程序,则上述相同的代码将起作用。这将确保下一个spark-submit进入位于EMR中安装了spark-submit二进制文件的主节点上。