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

Dip*_*kar 15 hadoop hdfs apache-spark rdd pyspark

我们都知道Spark会在内存中进行计算.我只是好奇以下.

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

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

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

mrs*_*vas 21

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

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

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

Spark如果不再使用RDD或Dataframe,自动取消分配.为了了解是否缓存了RDD或Dataframe,您可以进入Spark UI - > Storage表并查看Memory详细信息.您可以使用df.unpersist()或从内存中sqlContext.uncacheTable("sparktable")删除df表. 链接阅读更多

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

如果RDD不适合内存,则某些分区将不会被缓存,并且每次需要时都会在运行时重新计算. 链接阅读更多

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

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

一般来说,我们坚持RDD需要大量的计算或/和混乱(默认情况下,火花持续混乱的RDD以避免代价高昂的网络I/O),因此当对持久的RDD执行任何操作时,只需执行该操作而不是从每个沿袭图开始再次计算它,在这里检查RDD持久性水平.


rak*_*esh 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用于驱逐数据.有关如何在spark中完成内存管理的更多信息,请参阅.