首页 > 解决方案 > 如何在 Spark Standalone 集群中提交多个作业?

问题描述

我有一台装有 Apache Spark 的机器。机是64GB RAM 16 Cores

我在每个 Spark 工作中的目标

1. Download a gz file from a remote server
2. Extract gz to get csv file (1GB max)
3. Process csv file in spark and save some stats.

目前,我正在为通过以下操作收到的每个文件提交一份工作

./spark-submit --class ClassName --executor-cores 14 --num-executors 3 --driver-memory 4g --executor-memory 4g jar_path

并等待此作业完成,然后为新文件开始新作业。

现在我想通过并行运行多个作业来利用 64GB RAM。

我可以为每个作业分配 4g RAM,并希望在有足够的作业已经运行时将我的作业排队。

我怎样才能做到这一点?

标签: scalaapache-spark

解决方案


您应该从不同的线程提交多个作业:

https://spark.apache.org/docs/latest/job-scheduling.html#scheduling-within-an-application

并配置池属性(将 schedulingMode 设置为 FAIR):

https://spark.apache.org/docs/latest/job-scheduling.html#configuring-pool-properties

来自 Spark 文档:

https://spark.apache.org/docs/latest/spark-standalone.html#resource-scheduling

独立集群模式目前仅支持跨应用程序的简单 FIFO 调度程序。但是,为了允许多个并发用户,您可以控制每个应用程序将使用的最大资源数。默认情况下,它将获取集群中的所有内核,这仅在您一次只运行一个应用程序时才有意义。您可以通过设置 spark.cores.max ... 来限制核心数量。

默认情况下,它将所有资源用于一个作业。我们需要定义资源,以便它们也将是运行其他作业的空间。以下是您可以用来提交 spark 作业的命令。

bin/spark-submit --class classname --master spark://hjvm1:6066 --deploy-mode cluster  --driver-memory 500M --conf spark.executor.memory=1g --conf spark.cores.max=1 /data/test.jar

推荐阅读