在YARN上运行多个相似的Spark Submit作业

3
我有多个Spark提交作业,需要将其作为AWS EMR集群上的一个步骤提交。所有步骤的数据输入都相同,目前位于S3存储桶中,输出也在S3中,并且所有步骤需要并行执行。
目前AWS EMR不支持并行执行Spark-submit,但有一种方法可以通过更改EMR的YARN调度程序为FAIR调度程序来实现,但这种方法的问题是我们需要手动定义执行程序的内核/内存,这是额外的负担。
寻找在AWS EMR中处理此场景的最佳方式,有什么建议吗?谢谢,-Jack
1个回答

9

目前AWS EMR不支持Spark-submit的并行执行

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

如果您预先知道最大同时spark-submit执行数(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 App中的不同线程发起的多个并行作业(在同一个SparkContext中):https://spark.apache.org/docs/latest/job-scheduling.html
可能需要进行一些应用程序架构更改才能实现此功能。例如,应用程序可以从队列中读取处理请求或公开Web服务以接收这些请求。

谢谢Denis,这篇文章非常有用。我想我需要修改应用程序,并尝试将多个Spark提交合并为一个Spark提交作业...尝试在有限的资源下尽可能地使用单个Spark提交。 - Jack
1
重要提示:如果您通过AWS SDK提交步骤,则需要指定 --conf spark.yarn.submit.waitAppCompletion=false--deploy-mode cluster。否则,AWS将排队您的步骤,它们甚至无法到达YARN。 - Azuaron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接