Spark RDD - 是否总是在RAM中的分区?

时间:2016-11-22 02:42:35

标签: hadoop apache-spark pyspark hdfs rdd

我们都知道Spark会在内存中进行计算。我对以下内容感到好奇。

  1. 如果我从HDFS在pySpark shell中创建10 RDD,是否意味着所有这10个RDD数据都将驻留在Spark Workers Memory上?

  2. 如果我不删除RDD,它会永远留在记忆中吗?

  3. 如果我的数据集(文件)大小超过可用的RAM大小,那么数据将存储在哪里?

2 个答案:

答案 0 :(得分:21)

  

如果我从HDFS在我的pySpark shell中创建10个RDD,它是否意味着所有这10个RDD   数据将驻留在Spark Memory?

是,所有10个RDD数据将在火花工人机器RAM 中传播。但并非所有机器都必须具有每个RDD的分区。当然,RDD只有在对其进行任何操作时才会在内存中存储数据,因为它会被懒惰地评估。

  

如果我不删除RDD,它会永远存在于内存中吗?

Spark如果不再使用,则自动取消显示RDD或Dataframe 。为了知道是否缓存了RDD或Dataframe,您可以进入Spark UI - >存储表并查看内存详细信息。您可以使用df.unpersist()sqlContext.uncacheTable("sparktable")从内存中删除df或表。 link to read more

  

如果我的数据集大小超过可用的RAM大小,数据将在何处   存储吗

如果RDD不适合内存,则某些分区将不会被缓存,并且每次需要时都会在运行时重新计算。 link to read more

  

如果我们说RDD已经在RAM中,意味着它在内存中,那么需要持久化()? - 根据评论

要回答您的问题,当在RDD上触发任何操作并且该操作无法找到内存时,它可以删除未缓存/未存在的RDD。

一般情况下,我们持久存在需要大量计算或/和改组的RDD (默认 spark persist shuffled RDDs以避免代价高昂的网络I / O ),所以当对持久化RDD执行任何操作时,只是它将仅执行该操作,而不是从每个沿袭图表check RDD persistence levels here开始再次计算它。

答案 1 :(得分:9)

  

如果我在Pyspark shell中创建10个RDD,它是否意味着所有这10个RDD   数据将驻留在Spark Memory?

答案:RDD只包含“沿袭图”(应用的转换)。所以,RDD不是数据!当我们对RDD执行任何操作时,将在操作之前应用所有转换。因此,如果没有显式(当然有一些缓存隐式缓存的优化)缓存,每次执行一个操作时,整个转换和操作都会再次执行!!!

例如 - 如果您从HDFS创建RDD,应用一些转换并对转换的RDD执行2个操作,HDFS读取和转换将执行两次!!!

因此,如果您想避免重新计算,则必须保留RDD。为了坚持不懈,您可以选择HEAP,Off-Heap,Disk上的一个或多个组合。

  

如果我不删除RDD,它会永远存在于内存中吗?

答案:考虑到RDD只是“沿袭图”,它将遵循托管语言的相同范围和生命周期规则。但是如果你已经坚持了计算结果,你就可以解决问题了!

  

如果我的数据集大小超过可用的RAM大小,那么数据将存储在哪里?

答案:假设您实际上已将RDD保存/缓存在内存中,它将存储在内存中。 LRU用于驱逐数据。 Refer有关如何在spark中完成内存管理的更多信息。