spark rdd-分区总是在ram中吗?

yftpprvb  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(432)

我们都知道spark在内存中进行计算。我只是好奇下面的内容。
如果我创造10个 RDD 在我的hdfs的pyspark shell中,它是否意味着所有这些 RDD 的数据将驻留在spark workers内存中?
如果我不删除 RDD ,它会永远留在记忆中吗?
如果我的数据集(文件)大小超过可用的ram大小,数据将存储在哪里?

bvjveswy

bvjveswy1#

如果我在pyspark shell中创建10rdd,是否意味着所有这些10rdd数据都将驻留在spark内存中?
答:rdd只包含“沿袭图”(应用的转换)。所以,rdd不是数据!!!当我们对rdd执行任何操作时,所有的转换都是在操作之前应用的。因此,如果没有显式(当然有一些优化隐式缓存)缓存,每次执行一个操作时,整个转换和操作都会再次执行!!!
e、 如果您从hdfs创建一个rdd,应用一些转换并对转换后的rdd执行两个操作,hdfs read和转换将执行两次!!!
因此,如果要避免重新计算,就必须持久化rdd。对于持久化,您可以选择一个或多个堆内、堆外和磁盘的组合。
如果我不删除rdd,它会永远留在内存中吗?
答:考虑到rdd只是“谱系图”,它将遵循宿主语言的相同范围和生存期规则。但是如果已经持久化了计算结果,就可以取消持久化!!!
如果我的数据集大小超过可用的ram大小,数据将存储在哪里?
答:假设您实际上已经将rdd持久化/缓存在内存中,它将被存储在内存中。lru用于逐出数据。有关如何在spark中进行内存管理的更多信息,请参阅。

flvlnr44

flvlnr442#

如果我从hdfs在pyspark shell中创建10rdd,是否意味着所有这些10rdd数据都将驻留在spark内存中?
是的,所有10个rdds数据都将分布在spark worker机器的ram中。但并非所有机器都必须具有每个rdd的分区。非正常的rdd只有在对它执行任何操作时才会在内存中有数据,因为它是被延迟评估的。
如果我不删除rdd,它会永远留在记忆中吗?
如果不再使用rdd或Dataframe,spark会自动取消持久性。为了知道是否缓存了rdd或Dataframe,您可以进入spark ui-->存储表并查看内存详细信息。你可以用 df.unpersist() 或者 sqlContext.uncacheTable("sparktable") 移除 df 或内存中的表。链接阅读更多
如果我的数据集大小超过可用的ram大小,数据将存储在哪里?
如果rdd不适合内存,则某些分区将不会被缓存,并且每次需要时都会动态重新计算。链接阅读更多
如果我们说rdd已经在ram中,也就是说它在内存中,那么需要persist()吗--根据意见
为了回答您的问题,当rdd上触发任何操作时,如果该操作找不到内存,它可以删除未缓存/未持久化的rdd。
一般来说,我们持久化rdd,这需要大量的计算或/和洗牌(默认情况下,spark持久化洗牌rdd以避免昂贵的网络i/o),因此当对持久化rdd执行任何操作时,它只会执行该操作,而不是根据沿袭图从一开始就再次计算它,请在此处检查rdd持久化级别。

相关问题