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



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

据我所知,当我们使用缓存数据帧时,并没有发生数据移动,它只是保存在执行器的内存中。因此,这应该只是一个设置/取消设置标志的问题。

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

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

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

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

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

卸载DataFrame只是向BlockManager发送一个请求(同步或异步(以删除RDD块。如果它以异步方式发生,则开销为零(减去执行器在运行任务时必须做的额外工作(。

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

从某种意义上说,这就是它被掩盖的原因。由于DataFrame或RDD只是描述分布式计算的抽象,在创建时什么都不做,所以这种持久化/取消持久化只是设置/取消设置一个标志。

在执行时可以注意到变化。

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

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

相关内容

最新更新