【问题标题】:How Size of Driver Memory & Executor memory is allocated when using Spark on Amazon EMR在 Amazon EMR 上使用 Spark 时如何分配驱动程序内存和执行程序内存的大小
【发布时间】:2017-06-10 11:35:27
【问题描述】:

我使用带有 10 个节点的 AWS EMR 5.2 实例 m4.2x large 来使用 Spark 2.0.2 运行我的 Spark 应用程序。我使用了maximizeResourceAllocation=true 的属性。我在 spark-defaults.conf 中看到了以下属性:

spark.executor.instances         10
spark.executor.cores             16
spark.driver.memory              22342M
spark.executor.memory            21527M
spark.default.parallelism        320

yarn-site.xml 中,我看到了 yarn.nodemanager.resource.memory-mb=24576(24GB)。我只知道 spark.executor.instances 设置为 10,因为我使用的是 10 个节点集群。但是谁能向我解释其他属性是如何设置的,比如驱动程序内存和执行程序内存是如何计算的?我也使用了maximizeResourceAllocation=true的属性。这对内存有什么影响?

【问题讨论】:

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


    【解决方案1】:

    我推荐这本书Spark in Action。简而言之,执行程序是运行由驱动程序交付给它们的任务的容器。集群中的一个节点可以根据资源分配启动多个执行器。 CPU 分配支持并行运行任务,因此最好为执行程序提供更多内核。所以更多的 CPU 内核意味着更多的任务槽。执行程序的内存分配应该以适合 YARN 容器内存的合理方式进行。 YARN 容器内存 >= 执行器内存 + 执行器内存开销。

    Spark 保留部分内存用于缓存数据存储和临时 shuffle 数据。使用参数spark.storage.memoryFraction(默认0.6)和spark.shuffle.memoryFraction(默认0.2)为这些设置堆。因为堆的这些部分可以在 Spark 测量和限制它们之前增长,所以必须设置两个额外的安全参数:spark.storage.safetyFraction(默认 0.9)和spark.shuffle.safetyFraction(默认 0.8)。安全参数将内存部分降低指定的数量。默认情况下用于存储的堆的实际部分为 0.6 × 0.9(安全分数乘以存储内存分数),等于 54%。类似地,用于 shuffle 数据的堆部分为 0.2 × 0.8(安全分数乘以 shuffle 内存分数),等于 16%。然后,您将 30% 的堆保留用于运行任务所需的其他 Java 对象和资源。但是,您应该只指望 20%。

    Driver 在 executor 之间协调阶段和任务。执行器的结果会返回给驱动程序,因此驱动程序的内存也应该被认为可以处理所有可以从所有执行器收集的数据。

    【讨论】:

    • 如果我不设置属性maximizeResourceAllocation=true会有什么区别??
    • 它用于计算整个集群资源并根据计算结果设置默认配置。如果未启用此选项,某些参数将设置为默认值,例如 spark.default.parallelism = 100
    • 澄清一个小问题,“然后,您将 30% 的堆保留给其他 Java 对象和运行任务所需的资源。”是因为 100% - 54% - 16% = 30%。
    猜你喜欢
    • 2017-05-29
    • 2015-11-24
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    相关资源
    最近更新 更多