在 Spark Streaming 中,我必须在 cache() 或 persist() 之后调用 count() 才能强制缓存/持久性真正发生吗?

Chr*_*ord 5 caching apache-spark rdd

观看关于 Spark 内部结构的这段非常好的视频,演示者说,除非在缓存 RDD 后对其执行操作,否则缓存不会真正发生。

我从未见过在任何其他情况下调用 count() 。所以,我猜测他只是在 cache() 之后调用 count() 来强制他给出的简单示例中的持久性。没有必要每次在代码中调用cache() 或persist() 时都执行此操作。这是正确的吗 ?

cod*_*ode 6

除非在缓存后对 RDD 执行操作,否则缓存不会真正发生。

这是100%正确的。方法cache/persist只会将 RDD 标记为缓存。每当在 RDD 上调用操作时,RDD 内的项目都会被缓存。

...在他给出的简单示例中,仅在 cache() 之后调用 count() 来强制持久化。没有必要每次在代码中调用cache() 或persist() 时都执行此操作。这是正确的吗 ?

你又100%正确了。但我会对此进行详细说明。

为了便于理解,请考虑下面的示例。

rdd.cache()
rdd.map(...).flatMap(...) //and so on
rdd.count() //or any other action
Run Code Online (Sandbox Code Playgroud)

假设您的 RDD 中有 10 个文档。当上面的代码片段运行时,每个文档都会执行以下任务:

  • 缓存的
  • 地图功能
  • 平面地图函数

另一方面,

rdd.cache().count()  
rdd.map(...).flatMap(...)  //and so on
rdd.count()  //or any other action
Run Code Online (Sandbox Code Playgroud)

当上面的代码片段运行时,首先缓存所有 10 个文档(整个 RDD)。然后应用map函数和flatMap函数。

两者都是正确的,并且按照要求使用。希望这能让事情变得更加清楚。