我使用客户端模式向具有客户端模式的YARN群集提交了Spark Streaming应用程序,如下所示:
./spark-submit \
--jars $JARS \
--class $APPCLS \
--master yarn-client \
--driver-memory 64m \
--executor-memory 64m \
--conf spark.shuffle.service.enabled=false \
--conf spark.dynamicAllocation.enabled=false \
--num-executors 6 \
/data/apps/app.jar
executorMemory * executorCount + driverMemory = 64m * 6 + 64m = 448m ,
但该应用程序实际上使用了 3968mb 。为什么会发生这种情况?如何减少内存使用?
答案 0 :(得分:2)
Spark配置参数spark.yarn.executor.memoryOverhead
和spark.yarn.driver.memoryOverhead
在您的情况下默认为384 MB(docs)。
然后有一个事实是YARN具有内存分配粒度(yarn.scheduler.increment-allocation-mb
),默认为512 MB。所以一切都被四舍五入到了它的倍数。
此外,还有一个默认为1 GB的最小分配大小(yarn.scheduler.minimum-allocation-mb
)。它在你的情况下设置得较低,或者你没有正确查看内存分配。
与内存使用相比,所有这些开销都应该可以忽略不计。您应该将--executor-memory
设置为20 GB或更多。你为什么要配置一个可笑的低内存量?