我正在使用带有10个节点的AWS EMR 5.2实例m4.2x大小来运行使用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
的属性。这对内存有何影响?
答案 0 :(得分: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 fraction),等于16%。然后,您有30%的堆保留用于运行任务所需的其他Java对象和资源。但是,你应该只占20%。
驱动程序协调执行程序之间的阶段和任务。执行程序的结果将返回给驱动程序,因此驱动程序的内存也应该被视为处理可以从所有执行程序收集的所有数据。