2

我使用带有 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.How 的属性,这对内存有什么影响?

4

1 回答 1

5

我推荐这本书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 memory 分数),等于 16%。然后,您将 30% 的堆保留用于运行任务所需的其他 Java 对象和资源。但是,您应该只指望 20%。

Driver 在 executor 之间编排阶段和任务。执行器的结果会返回给驱动程序,因此驱动程序的内存也应该考虑处理所有数据,这些数据可以从所有执行器收集在一起。

于 2017-01-25T10:45:49.707 回答