【问题标题】:Spark submit using mesos dcos cli使用 mesos dcos cli 提交 Spark
【发布时间】:2016-03-31 02:51:05
【问题描述】:

我正在尝试使用 DCOS cli 在 mesos 上启动 spark 流式传输作业。 我可以开始工作了。我的程序需要一个配置文件作为 cli 参数传递。如何使用 dcos spark run --submit-args 实现这一目标?

我试过 --files http://server/path/to//file 希望它能下载文件,但没有成功。驱动程序启动但由于缺少配置文件而失败。

我还尝试将 jar 和配置文件汇总为 tar 并提交。我可以在 Mesos 日志中看到 tar 已获取并解压缩。在工作目录中可以看到 config 和 jar 文件。但是作业因 ClassNotFoundException 而失败。我怀疑 spark-submit 的启动方式有问题。

dcos spark run --submit-args="--supervise --deploy-mode cluster --class package.name.classname http://file-server:8000/Streaming.tar.gz Streaming.conf"

关于如何进行的任何提示?另外,我可以在哪个日志文件中看到 DCOS 使用的底层 spark-submit 命令?

【问题讨论】:

    标签: mesos mesosphere marathon dcos


    【解决方案1】:

    以下是您应该启动以使其工作的命令示例:

    dcos spark run --submit-args='--conf spark.mesos.uris=https://s3-us-west-2.amazonaws.com/andrey-so-36323287/pi.conf --class JavaSparkPiConf https://s3-us-west-2.amazonaws.com/andrey-so-36323287/sparkPi_without_config_file.jar /mnt/mesos/sandbox/pi.conf'

    在哪里

    --conf spark.mesos.uris=... Mesos 启动驱动程序或执行程序时要下载到沙箱的 URI 的逗号分隔列表。这适用于粗粒度和细粒度模式。

    /mnt/mesos/sandbox/pi.conf 主类作为第 0 个参数接收的下载文件的路径(参见下面的代码 sn-p)。 /mnt/mesos/sandbox/ 是容器内的标准路径,映射到对应的 mesos-task 沙箱。

    public final class JavaSparkPiConf {
    
      public static void main(String[] args) throws Exception {
        SparkConf sparkConf = new SparkConf().setAppName("JavaSparkPi");
        JavaSparkContext jsc = new JavaSparkContext(sparkConf);
    
        Scanner scanner = new Scanner(new FileInputStream(args[0]));
        int slices;
        if (scanner.hasNextInt()) {
          slices = scanner.nextInt();
        } else {
          slices = 2;
        }
        int n = 100000 * slices;
        List<Integer> l = new ArrayList<>(n);
        for (int i = 0; i < n; i++) {
          l.add(i);
        }
    
        JavaRDD<Integer> dataSet = jsc.parallelize(l, slices);
    
        int count = dataSet.map(new Function<Integer, Integer>() {
          @Override
          public Integer call(Integer integer) {
            double x = Math.random() * 2 - 1;
            double y = Math.random() * 2 - 1;
            return (x * x + y * y < 1) ? 1 : 0;
          }
        }).reduce(new Function2<Integer, Integer, Integer>() {
          @Override
          public Integer call(Integer integer, Integer integer2) {
            return integer + integer2;
          }
        });
    
        System.out.println("Pi is roughly " + 4.0 * count / n);
    
        jsc.stop();
      }
    }
    

    【讨论】:

    • 就是这样。缺少的部分是在 /mnt/mesos/sandbox 中查找下载的文件。
    【解决方案2】:

    Streaming.conf 只是一个将传递给您的驱动程序的字符串。您的司机必须能够看到它。最简单的方法是将其放置在可访问的位置,指定您希望通过spark.mesos.uris [1] 将其下载到沙箱。您也可以编写应用程序以支持从远程位置读取,然后在 CLI 上传递该位置。

    --files 用于在执行程序中放置文件,但您试图将文件传递给驱动程序,因此无法正常工作。

    [1]http://spark.apache.org/docs/latest/running-on-mesos.html

    迈克尔·古梅尔特
    中间层

    【讨论】:

    • 我知道参数是传递给程序的字符串 :) 驱动程序已经读取了该文件。我正在尝试使其可用。我会试试你的建议。 URI 中指定的链接在什么时候被下载?我在启动 spark 上下文之前阅读了 conf 文件。
    • 另外,如果我需要在执行器中放置额外的文件(--files)或jar(--jars),我该如何实现?
    • spark.mesos.uris 确实会下载该文件。我可以在 mesos fetcher 日志中看到这一点。但它不在当前目录或类路径中。我无法在我的代码中“看到”该文件。我已经求助于直接从共享位置阅读,但知道如何管理和共享资源会很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2017-11-09
    相关资源
    最近更新 更多