Spark Databricks 缓存的分数在执行操作后下降(Scala)

sus*_*047 6 caching scala persist apache-spark databricks

我使用 persist 命令在 MEMORY_AND_DISK 上缓存数据帧,并且一直在观察一个奇怪的模式。

当执行必要转换的特定作业(作业 6,在下面的屏幕截图中)完成时,持久数据帧会缓存到 100%,但在作业 9(数据质量检查)后,它会将缓存的分数降低到 55%,从而使其达到重新计算以获得部分丢失的数据(可以在作业12中看到)。我还从指标(Databricks 上的 Ganglia UI)中看到,在任何给定实例中至少有 50 GB 的可用内存。

(下图部分被遮蔽,以避免敏感数据暴露) 在此输入图像描述

当有足够的内存用于其他转换/操作时,为什么 Spark 会丢弃/刷新内存/磁盘上持久存在的 50 MB 的对象?除了显式将其写入临时存储的解决方法之外,是否有解决方案可以避免这种情况?

小智 -1

Spark 的缓存还具有可配置的大小限制,该限制是使用spark.storage.memoryFraction配置属性指定的。默认情况下,该属性设置为执行器上可用内存的 60% 可用于缓存。如果您正在缓存大量数据帧并且缓存的总大小超过此限制,Spark 将开始驱逐数据帧以保持在限制范围内。

spark.storage.memoryFraction为了避免这些问题,您可以尝试通过将配置属性设置为更高的值来增加缓存的大小。您还可以尝试使用该spark.cacheTable()方法显式缓存数据帧,这将导致 Spark 优先将数据保留在缓存中,而不是其他数据帧。