我使用客户端模式向 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。为什么会发生这种情况以及如何减少内存使用?
最佳答案
Spark 配置参数 spark.yarn.executor.memoryOverhead
和 spark.yarn.driver.memoryOverhead
在您的情况下默认为 384 MB ( docs )。
事实上,YARN 具有内存分配粒度 (yarn.scheduler.increment-allocation-mb
),默认为 512 MB。因此,所有内容都会四舍五入到该值的倍数。
还有一个最小分配大小 (yarn.scheduler.minimum-allocation-mb
),默认为 1 GB。您的情况可能被设置得较低,或者您没有正确查看内存分配。
与您的内存使用相比,所有这些开销应该可以忽略不计。您应该将 --executor-memory
设置为 20 GB 或更多。为什么你要尝试配置一个低得离谱的内存量?
关于apache-spark - 为什么spark Streaming从kafka接收数据使用的内存比<executorMemory * executorCount + driverMemory>更多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31402735/