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

时间:2021-06-08 21:46:59

标签: apache-spark memory mapreduce hdfs rdd

我一直听说 Spark 比经典的 Map Reduce 框架(如 Hadoop)快 100 倍。但最近我读到这只有在 RDD 被缓存时才成立,我认为这总是完成但需要显式缓存 () 方法。

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

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

问题:

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

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

>

提前致谢。

3 个答案:

答案 0 :(得分:1)

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

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

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

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

缓存时可以考虑的几个指针:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

回答您的问题:

Q1:如果我不使用cache()或persist(),每个RDD是存储在内存中、缓存中还是磁盘上(本地文件系统或HDFS)? Ans:在为文件创建rdd时,将worker节点中可用的数据作为HDFS中的块考虑

val rdd=sc.textFile("<HDFS Path>")

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

Q2:如果 RDD_THREE 依赖于 RDD_TWO 而这又依赖于 RDD_ONE(世系)如果我没有在 RDD_THREE 上使用 cache() 方法 Spark 应该重新计算 RDD_ONE(从磁盘重新读取它)然后 RDD_TWO 来获取 RDD_THREE? Ans: 是的。因为在这种情况下使用 cache() 将底层结果不存储在驱动程序内存中。