运行 多个相似的 spark 在 yarn 上提交作业

Running multiple similar spark submit jobs on yarn

我有多个 spark 提交作业,需要作为 AWS EMR 集群上的一个步骤提交,我的步骤的数据输入对于所有步骤都是相同的,当前位于 S3 存储桶中,输出也在 s3 上,所有步骤需要并行执行。

目前AWS EMR不支持并行执行spark-submits,但是有一种方法是将EMR的YARN的scheduler改成FAIR Scheduler,但是这种方法的问题是我们需要手动定义Cores /Memory执行者是一项开销。

正在寻找在 AWS EMR 中处理这种情况的最佳方法,有什么建议吗????

谢谢, -杰克

Currently AWS EMR does not support parallel execution of spark-submit

实际上它是支持的,但有点棘手。这有两个主要问题,每个 Spark 作业使用的执行程序数量和主节点上驱动程序进程的内存量。

如果你事先知道同时spark-submits执行的最大数量(N),你可以玩--driver-memory,--num-executors,--executor-cores 和 --executor-memory 参数以确保每个作业仅占用可用资源的 1/N(如果可以等到较早提交的作业完成,则可以使用更多资源)。如果这种并行执行在实践中很少发生,这是非常低效的。

更好的方法是使用动态分配: https://spark.apache.org/docs/latest/configuration.html#dynamic-allocation

可以使用的参数很少,但是当没有其他作业 运行 时,它将允许单个作业利用几乎所有可用资源(如果 maxExecutors 是 spark.dynamicAllocation.maxExecutors 是最大可用数量一组给定参数的执行器),如果多个 运行,则回退到在作业之间平均共享执行器。这种重新平衡不会立即发生,因为 运行 任务不会中断。此外,为此,所有 spark-submit 调用都必须使用动态分配。如果其中一个 spark-submit 调用不使用动态分配,它仍然能够获取所有资源并饿死其余的 Spark 作业。

下面是一个动态分配参数的例子:

spark-submit \
    --deploy-mode client \
    --master yarn \
    --conf spark.dynamicAllocation.enabled=true \
    --conf spark.shuffle.service.enabled=true \
    --conf spark.dynamicAllocation.executorIdleTimeout=60s \
    --conf spark.dynamicAllocation.cachedExecutorIdleTimeout=60s \
    --conf spark.dynamicAllocation.minExecutors=1 \
    --conf spark.dynamicAllocation.maxExecutors=4 \
    --conf spark.dynamicAllocation.initialExecutors=1 \
    <other Spark options>

对于具有 8 个节点的集群:

  • 1 个工作 - 4 个执行者
  • 2 个作业 - 每个
  • 4 个执行器
  • 3 个工作 - 每个
  • 2-3 个执行者
  • 4 个作业 - 每个
  • 执行 2 个作业
  • 5-8 个作业 - 每个作业 1-2 个执行器
  • 超过 8 个作业 - 一些作业将等待,其余每个将获得 1 个执行器。

FAIR 调度也有效,它允许比动态分配更好地利用集群资源(因为它不会等到 executorIdleTimeout 或 cachedExecutorIdleTimeout 过期)但它只适用于由同一线程中的不同线程启动的多个并行作业Spark 应用程序(在同一个 SparkContext 中):https://spark.apache.org/docs/latest/job-scheduling.html

可能需要对应用架构进行一些更改才能启用此功能。例如。该应用程序可以从队列中读取处理请求或公开 Web 服务来接收它们。