Spark Databricks部分缓存在操作后丢弃(Scala)

7eumitmz  于 2022-12-23  发布在  Apache
关注(0)|答案(1)|浏览(174)

bounty已结束。此问题的答案可获得+50声望奖励。奖励宽限期将在17小时后结束。Sushant Pachipulusu希望引起更多人关注此问题:这似乎是一个不被谈论的常见问题。想知道如何以最有效的方式解决这个问题。愿最好的答案获胜:)

我使用persist命令在MEMORY_AND_DISK上缓存一个 Dataframe ,并观察到一个奇怪的模式。
在执行特定作业时,将持久化 Dataframe 缓存到100%(作业6,在下面的屏幕截图中),它完成了必要的转换,但发布了作业9(数据质量检查)它将缓存的部分降至55%,这使得它需要重新计算以获得部分丢失的数据(可以在Job 12中看到)。我还从指标(Databricks上的Ganglia UI)中看到,在任何给定的示例中,至少有50 GB的内存可用。

  • (下面的图像被部分遮盖,以避免敏感数据暴露)* x1c 0d1x

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

gg58donl

gg58donl1#

Spark的缓存也有一个可配置的大小限制,这是通过spark.storage.memoryFraction配置属性指定的。默认情况下,该属性设置为执行器上可用内存的60%可用于缓存。如果您缓存了大量 Dataframe ,并且该高速缓存的总大小超过了这个限制,Spark将开始驱逐 Dataframe 以保持在限制范围内。
为了避免这些问题,你可以尝试通过设置spark.storage.memoryFraction配置属性为更高的值来增加该高速缓存的大小,也可以尝试使用spark.cacheTable()方法显式缓存 Dataframe ,这将导致Spark优先于其他 Dataframe 将数据保存在缓存中。

相关问题