在内存中缓存 Spark 数据帧是不是有额外的开销?

Posted

技术标签:

【中文标题】在内存中缓存 Spark 数据帧是不是有额外的开销?【英文标题】:Is there an extra overhead to cache Spark dataframe in memory?在内存中缓存 Spark 数据帧是否有额外的开销? 【发布时间】:2020-04-07 07:29:46 【问题描述】:

我是 Spark 的新手,想了解在内存中持久化和取消持久化数据帧是否存在额外的开销/延迟。

据我所知,当我们使用缓存数据帧时不会发生数据移动,它只是保存在执行程序的内存中。所以这应该只是设置/取消设置标志的问题。

我在 spark 流作业中缓存一个数据帧,想知道这是否会导致批处理执行的额外延迟。

【问题讨论】:

看看[***.com/questions/52998082/…有没有用 【参考方案1】:

如果在内存中持久化和取消持久化数据帧需要额外的开销/延迟。

这取决于。如果您仅将 DataFrame 标记为持久化,则不会发生任何事情,因为它是一个惰性操作。您必须执行一个操作来触发 DataFrame 持久性/缓存。使用您所做的操作会增加额外的开销。

此外,将持久性(缓存)视为一种预先计算数据并将其保存在更靠近执行器(内存、磁盘或它们的组合)的方式。将数据从它所在的位置移动到执行器确实会在执行时增加额外的开销(即使只是一点点)。

在内部,Spark 将数据管理为块(在执行程序上使用 BlockManagers)。它们是按需交换块的对等点(使用类似 torrent 的协议)。

取消持久化 DataFrame 只是向 BlockManagers 发送请求(同步或异步)以删除 RDD 块。如果它以异步方式发生,则开销为零(减去执行者在运行任务时必须做的额外工作)。

所以这应该只是设置/取消设置标志的问题。

从某种意义上说,这就是它在幕后的样子。由于 DataFrame 或 RDD 只是描述分布式计算的抽象,并且在创建时什么都不做,所以这个 persist / unpersist 只是设置 / 取消设置一个标志。

可以在执行时注意到更改。

我在 spark 流作业中缓存一个数据帧,想知道这是否会导致批处理执行的额外延迟。

如果您使用异步缓存(默认),则延迟应该非常小。

【讨论】:

根据缓存对象是Dataframe还是RDD,惰性求值有什么不同吗? DataFrame 是 RDD 之上的一层。每个的缓存略有不同,但最终是 RDD.persist。 所以在这两种情况下,缓存都是一种惰性求值。对吗? 什么是“懒惰评估”? “由于 DataFrame 或 RDD 只是描述分布式计算的抽象,并且在创建时什么都不做,所以这个持久化/非持久化只是设置/取消设置一个标志。”

以上是关于在内存中缓存 Spark 数据帧是不是有额外的开销?的主要内容,如果未能解决你的问题,请参考以下文章

将大型数据集缓存到 spark 内存中时“超出 GC 开销限制”(通过 sparklyr 和 RStudio)

从缓存中删除 spark 数据帧

在 2 个数据帧 Spark 中缓存同一张表两次

基于堆外内存存储提升Spark内存资源使用效率

缓存后正在重新评估 Spark 数据帧

清理火花缓存数据