pyspark 内存使用优化:JVM内存高,但执行和存储内存低?

e0bqpujr  于 2022-11-01  发布在  Spark
关注(0)|答案(1)|浏览(254)

我正在运行一个spark应用程序。在spark应用程序完成后,当我检查spark日志中的executor部分时:

第一行是driver,第二行是executor,根据我的理解,executor中的内存堆主要分为三部分:
1.反向存储器:为系统保留的内存,用于存储Spark的内部对象,大约300 MB。
1.用户内存:用于用户定义的数据结构/函数/元数据等的存储器。
1.Spark存储器:用于存储和执行存储器共享
如果这是正确的,我不明白为什么即使执行程序的峰值执行和存储内存堆很低,而且应用程序中没有大的用户定义类或UDF,当我在Grafana中检查时,执行程序的峰值JVM内存堆在spark日志和利用率日志中都很高(~6.27 GiB)。
回到我的问题:
1.我对堆上内存的理解是否正确?
1.如果我的理解是正确的,为什么堆上JVM内存的峰值如此之高?
1.在这种情况下,我该如何进行内存优化呢?似乎执行和存储内存都不高。
非常感谢你的帮助。
P.S:我正在使用EC2上部署的K8S上的Spark 3.2.1和Delta Lake 1.2.0,2个示例具有8核16 RAM,1个示例用于驱动程序,1个示例用于执行器。1 core and 4g memory用于驱动程序,5 core and 8g memory用于执行器。

bhmjp9jg

bhmjp9jg1#

我发现这个peak JVM memory on-heap会根据驱动程序和执行器的内存配置而变化,尽管我仍然找不到关系或为什么peak JVM memory on-heap会这么高。
事实上,转换并不需要这么高的内存,当你降低spark应用程序的内存资源时,它的peak JVM memory on-heap也会更低。

相关问题