【问题标题】:How to spin up all nodes in my EMR cluster before running my spark job如何在运行 Spark 作业之前启动 EMR 集群中的所有节点
【发布时间】:2021-02-18 10:13:40
【问题描述】:

我有一个 EMR 集群,最多可以扩展到 10 个SPOT 节点。不使用时默认为 1 个CORE 节点(和 1 个MASTER)以明显节省成本。因此,它总共可以扩展到最多 11 个节点 1 CORE + 10 SPOT。 当我运行我的 spark 作业时,需要一段时间来启动 10 个SPOT 节点,而我的作业最终需要大约 4 小时才能完成。 我尝试等到所有节点都启动后,然后取消我的作业并立即重新启动它,以便它可以立即开始使用最大资源,而我的作业只花了大约 3 小时就完成了。

我有两个问题:

1. 有没有办法让 YARN 在开始工作之前启动所有必要的资源?我已经在提交作业时指定了诸如num-executorsexecutor-memoryexecutor-cores 等 spark-submit 参数。

2. 我还没有做成本分析,但是上面提到的第 1 点值得做吗? AWS 是否对启动时间收费,即使作业没有运行?

很想知道您的见解和建议。

谢谢

【问题讨论】:

    标签: amazon-web-services apache-spark amazon-emr


    【解决方案1】:

    我假设您为此使用 AWS 托管扩展。如果您可以切换到自定义缩放,您可以设置更积极的缩放规则,您还可以设置每个向上和向下缩放的节点数,这将帮助您更快地收敛到所需的节点数。

    自定义缩放的唯一缺点是需要 5 分钟才能触发。

    【讨论】:

    • 啊,我明白了。唉,扩展是由我公司的 IT 部门管理的。我必须说服他们为我的集群设置一些激进的扩展级别。是时候买一箱啤酒了:P 谢谢你的信息!
    【解决方案2】:

    有没有办法让 YARN 在之前启动所有必要的资源 开始我的工作?

    不知道如何做到这一点。但是,在我看来,这不值得这样做。 Spark 足够聪明,可以为我们做到这一点。

    它知道当更多实例在集群中出现或消失时如何分配任务。为了实现这一点,您应该注意某种 spark 配置。

    您应该将其设置为 true spark.dynamicAllocation.enabled。您可以更改或保留其他一些相关配置。

    有关更多详细信息,请参阅此文档spark.dynamicAllocation.enabled

    请根据您的 spark 版本查看文档。此链接适用于 spark 版本2.4.0

    AWS 是否对启动时间收费,即使作业没有运行?

    您使用实例的每一秒都会向您收费,最少为一分钟。您的作业是否正在运行并不重要。 即使它们在集群中闲置,您也必须为此付费。

    更多详情请参考以下链接:

    EMR FAQ

    EMR PRICING

    希望这能让您对 EMR 定价和与动态分配相关的某些 spark 配置有所了解。

    【讨论】:

    • 我知道spark.dynamicAllocation.enabled。不幸的是,我无法使用它,因为我的工作使用了一个大型数据集,并且我必须计算火花参数以优化工作时间。但是,当作业开始并且有一个节点可以使用时,我会收到带有isDataPresent: falseFetchfailed 错误的失败任务。当启动足够多的节点时,它会重试第二次(由于大量没有失败的任务),然后能够很快成功。
    猜你喜欢
    • 1970-01-01
    • 2021-12-07
    • 2018-10-19
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2019-05-30
    相关资源
    最近更新 更多