Spark 中的 RDD:它们存储在哪里以及如何存储?

RDD in Spark: where and how are they stored?

我一直听说 Spark 比 Hadoop 等经典 Map Reduce 框架快 100 倍。但最近我读到只有缓存 RDD 时才会出现这种情况,我认为这总是会完成,但需要显式缓存 () 方法。

我想了解在整个工作过程中如何存储所有生成的 RDD。假设我们有这样的工作流程:

  1. 我读了一个文件 -> 我得到 RDD_ONE
  2. 我使用 RDD_ONE 上的地图 -> 我得到 RDD_TWO
  3. 我在 RDD_TWO
  4. 上使用任何其他转换

问题:

如果我不使用 cache() 或 persist() 是不是每个 RDD 都存储在内存、缓存或磁盘(本地文件系统或 HDFS)中?

if RDD_THREE 依赖于 RDD_TWO 而这又依赖于 RDD_ONE (沿袭)如果我没有在 RDD_THREE Spark 上使用 cache () 方法应该重新计算 RDD_ONE(从磁盘重新读取)然后 RDD_TWO 得到 RDD_THREE?

提前致谢。

spark 中有两种类型的操作:转换和操作。数据帧上的转换将 return 另一个数据帧,数据帧上的操作将 return 一个值。

转换是惰性的,因此当执行转换时,spark 会将其添加到 DAG 并在调用操作时执行它。

假设,您将文件读入数据帧,然后执行过滤、连接、聚合,然后进行计数。作为动作的计数操作实际上会踢掉之前的所有转换。

如果我们调用另一个动作(如显示),整个操作将再次执行,这可能很耗时。所以,如果我们不想 运行 整套操作一次又一次,我们可以缓存数据帧。

缓存时可以考虑的几个要点:

  1. 仅当结果数据帧是从重大转换中生成时才缓存。如果 spark 可以在几秒钟内重新生成缓存的数据帧,则不需要缓存。
  2. 当数据帧用于多个操作时应执行缓存。如果数据帧上只有 1-2 个动作,那么不值得将该数据帧保存在内存中。

默认情况下,每次 运行 对其执行操作时,每个转换后的 RDD 都可能会重新计算。但是,您也可以使用持久化(或缓存)方法将 RDD 持久化在内存中,在这种情况下,Spark 会将元素保留在集群上,以便在您下次查询时更快地访问它。还支持在磁盘上持久化 RDD,或跨多个节点复制

回答你的问题:

Q1:如果我不使用cache() 或persist() 是不是每个RDD 都存储在内存、缓存或磁盘(本地文件系统或HDFS)中? Ans:在为文件创建 rdd as

时,将工作节点中可用的数据视为 HDFS 中的块
val rdd=sc.textFile("<HDFS Path>")

来自每个节点 (HDFS) 的底层数据块将作为分区加载到它们的 RAM(即内存)中(在 spark 中,hdfs 数据块一旦加载到内存中就被称为分区)

Q2:如果RDD_THREE依赖于RDD_TWO而这又依赖于RDD_ONE(血统)如果我没有在[=20=上使用cache()方法] Spark应该重新计算RDD_ONE(从磁盘重新读取)然后RDD_TWO得到RDD_THREE? Ans:Yes.Since在这种情况下,通过使用 cache(),底层结果不会存储在驱动程序内存中。