amazon-web-services - 在 yarn 上运行多个类似的 Spark 提交作业

标签 amazon-web-services apache-spark hadoop-yarn amazon-emr

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

目前 AWS EMR 不支持 spark-submits 的并行执行,但是有一种方法是通过将 EMR 的 YARN 的调度器更改为 FAIR 调度器,但是这种方法的问题是我们需要手动为执行器定义 Cores/Memory是开销。

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

谢谢, - jack

最佳答案

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 服务以接收它们。

关于amazon-web-services - 在 yarn 上运行多个类似的 Spark 提交作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49758171/

相关文章:

amazon-web-services - CloudFormation AutoScalingGroup 不等待更新/扩展信号

amazon-web-services - 如何将 CloudFormation 输出传递到 CodeBuild 阶段?

amazon-web-services - 通过 IP 限制对 S3 存储桶的访问而不影响 IAM 凭证

apache-spark - 如果 Spark 中每个组满足特定条件,则向列添加值

hadoop - HDFS 用户的 Hive 查询失败

java - 如何使用AWS STS为s3中的文件的特定资源创建只读和只写 token

scala - Spark : efficiency of dataframe checkpoint vs. 显式写入磁盘

apache-spark - 从 Redshift 读取时获取无效的 S3 URI 错误

hadoop - 从 spark master UI 清除 Spark Job 历史记录

xml - 在配置 hadoop 时启动 yarn 服务时出现错误