我使用AWS EMR 5.2实例m4.2x large,包含10个节点,用于使用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
这会影响内存吗?
我建议使用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%.
驱动程序在执行者之间协调阶段和任务.执行程序的结果将返回给驱动程序,因此驱动程序的内存也应该被视为处理所有可以从所有执行程序收集的数据.