Spark 中的 RDD:它们存储在哪里以及如何存储?
RDD in Spark: where and how are they stored?
我一直听说 Spark 比 Hadoop 等经典 Map Reduce 框架快 100 倍。但最近我读到只有缓存 RDD 时才会出现这种情况,我认为这总是会完成,但需要显式缓存 () 方法。
我想了解在整个工作过程中如何存储所有生成的 RDD。假设我们有这样的工作流程:
- 我读了一个文件 -> 我得到 RDD_ONE
- 我使用 RDD_ONE 上的地图 -> 我得到 RDD_TWO
- 我在 RDD_TWO
上使用任何其他转换
问题:
如果我不使用 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 并在调用操作时执行它。
假设,您将文件读入数据帧,然后执行过滤、连接、聚合,然后进行计数。作为动作的计数操作实际上会踢掉之前的所有转换。
如果我们调用另一个动作(如显示),整个操作将再次执行,这可能很耗时。所以,如果我们不想 运行 整套操作一次又一次,我们可以缓存数据帧。
缓存时可以考虑的几个要点:
- 仅当结果数据帧是从重大转换中生成时才缓存。如果 spark 可以在几秒钟内重新生成缓存的数据帧,则不需要缓存。
- 当数据帧用于多个操作时应执行缓存。如果数据帧上只有 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(),底层结果不会存储在驱动程序内存中。
我一直听说 Spark 比 Hadoop 等经典 Map Reduce 框架快 100 倍。但最近我读到只有缓存 RDD 时才会出现这种情况,我认为这总是会完成,但需要显式缓存 () 方法。
我想了解在整个工作过程中如何存储所有生成的 RDD。假设我们有这样的工作流程:
- 我读了一个文件 -> 我得到 RDD_ONE
- 我使用 RDD_ONE 上的地图 -> 我得到 RDD_TWO
- 我在 RDD_TWO 上使用任何其他转换
问题:
如果我不使用 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 并在调用操作时执行它。
假设,您将文件读入数据帧,然后执行过滤、连接、聚合,然后进行计数。作为动作的计数操作实际上会踢掉之前的所有转换。
如果我们调用另一个动作(如显示),整个操作将再次执行,这可能很耗时。所以,如果我们不想 运行 整套操作一次又一次,我们可以缓存数据帧。
缓存时可以考虑的几个要点:
- 仅当结果数据帧是从重大转换中生成时才缓存。如果 spark 可以在几秒钟内重新生成缓存的数据帧,则不需要缓存。
- 当数据帧用于多个操作时应执行缓存。如果数据帧上只有 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(),底层结果不会存储在驱动程序内存中。