Scala MapPartitions上的垃圾收集问题

Scala MapPartitions上的垃圾收集问题,scala,apache-spark,Scala,Apache Spark,我目前有一个mapPartitions作业,它将映射 迭代器,我遇到了一个问题,其中将有主要的GC成本 在某些处决中。一些遗嘱执行人需要20分钟,其中15分钟是 纯粹的垃圾收集,我相信这和 我正在输出的数组缓冲区。有人对如何做有什么建议吗 我可以做某种形式的流输出吗 另外,对于追踪/处理GC,有人有什么建议吗 spark中的问题?请参阅spark tuning官方页面中的以下文档。我希望这至少有助于指导您的分析: 内存管理概述 Spark中的内存使用主要分为两类:执行和存储。执行内存指用于洗牌、

我目前有一个mapPartitions作业,它将映射 迭代器,我遇到了一个问题,其中将有主要的GC成本 在某些处决中。一些遗嘱执行人需要20分钟,其中15分钟是
纯粹的垃圾收集,我相信这和 我正在输出的数组缓冲区。有人对如何做有什么建议吗 我可以做某种形式的流输出吗

另外,对于追踪/处理GC,有人有什么建议吗
spark中的问题?

请参阅spark tuning官方页面中的以下文档。我希望这至少有助于指导您的分析:

内存管理概述 Spark中的内存使用主要分为两类:执行和存储。执行内存指用于洗牌、联接、排序和聚合中的计算的内存,而存储内存指用于在集群中缓存和传播内部数据的内存。在Spark中,执行和存储共享一个统一的区域(M)。当不使用执行内存时,存储器可以获取所有可用内存,反之亦然。执行可能会在必要时收回存储,但只有在总存储内存使用量低于某个阈值(R)时才会执行。换句话说,R描述了M中的一个子区域,其中缓存的块永远不会被逐出。由于实现的复杂性,存储可能不会退出执行

这种设计确保了一些理想的性能。首先,不使用缓存的应用程序可以使用整个执行空间,避免不必要的磁盘溢出。其次,使用缓存的应用程序可以保留一个最小存储空间(R),在该空间中,它们的数据块不会被逐出。最后,这种方法为各种工作负载提供了合理的开箱即用性能,而无需用户了解内存如何在内部分配

尽管有两种相关配置,但典型用户不需要调整它们,因为默认值适用于大多数工作负载:

spark.memory.france将M的大小表示为(JVM堆空间-300MB)的一小部分(默认值为0.6)。其余的空间(40%)保留用于用户数据结构、Spark中的内部元数据,以及在稀疏和异常大的记录情况下防止OOM错误。 spark.memory.storageFraction将R的大小表示为M的分数(默认值为0.5)。R是M中的存储空间,其中缓存的块不会被执行逐出。
应该设置spark.memory.fraction的值,以便在JVM的旧代或“终身”代中舒适地容纳这一堆空间量。有关详细信息,请参阅下面关于高级GC调优的讨论。

“相信这与我正在输出的ArrayBuffer有很大关系。”因为我们对您如何使用它一无所知,所以不确定这里有多少人可以提供帮助。是什么让你相信是ArrayBuffer?你能发一些代码吗?