【问题标题】:Spark RDD - is partition(s) always in RAM?Spark RDD - 分区总是在RAM中吗?
【发布时间】:2017-04-05 14:28:34
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: hadoop apache-spark pyspark hdfs rdd


    【解决方案1】:

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

    是的,所有 10 个 RDD 数据都将分布在 spark worker 机器的 RAM 中。但并不是所有机器都必须每个RDD都有一个分区。当然,只有在延迟评估时对其执行任何操作时,RDD 才会将数据保存在内存中。

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

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

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

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

    如果我们说RDD已经在RAM中,也就是说它在内存中,那么persist()需要什么? --根据评论

    为了回答您的问题,当 RDD 上触发任何操作并且该操作找不到内存时,它可以删除未缓存/未持久化的 RDD。

    一般来说,我们坚持需要大量计算或/和洗牌的 RDD(默认情况下 spark 坚持洗牌的 RDD 以避免昂贵的网络 I/O),所以当对持久化 RDD 执行任何操作时,它只会执行该操作,而不是根据沿袭图从头开始重新计算,check RDD persistence levels here

    【讨论】:

    • 看起来更好。您应该提到,不需要随时将所有数据保存在内存中。
    • @mrsrinivas - “是的,所有 10 个 RDD 数据都将分布在 spark worker 机器的 RAM 中。”(执行操作后) - 如果是这种情况,为什么我们需要将 RDD 标记为使用persist() 或cache() 方法持久化它?
    • 我们持久化/缓存 rdds 以避免在下一阶段再次执行 cpu/memory/io 密集型操作/作业。
    【解决方案2】:

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

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

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

    所以,如果你想避免重新计算,你必须持久化 RDD。对于持久化,您可以选择 HEAP、Off-Heap、Disk 上的一种或多种组合。

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

    Answer: 考虑到 RDD 只是“谱系图”,它将遵循宿主语言的相同范围和生命周期规则。但是如果你已经持久化了计算结果,你可以不持久化!!!

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

    Answer: 假设您实际上已经将 RDD 持久化/缓存在内存中,它将被存储在内存中。 LRU 用于驱逐数据。 Refer 了解更多关于如何在 spark 中进行内存管理的信息。

    【讨论】:

    • 假设只有一个 HDFS 读取、转换和操作要做,如果要计算的数据集是 RAM 的三倍大小,那么 RDD 分区中的数据如何加载到内存中进行 Spark 计算?
    • 工人必须有缓冲区来保存单个分区的数据和处理数据所需的缓冲区,否则工人会崩溃!!!分区策略必须考虑到这一点!!!
    • 感谢 Rakesh 的澄清。因此,缓冲区的大小应该大于至少一个分区大小。是否有任何链接可以为我提供更多信息?再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2020-09-18
    • 2016-01-04
    • 2021-02-24
    • 1970-01-01
    • 2019-06-16
    • 2016-08-01
    • 2015-06-18
    • 2017-02-17
    相关资源
    最近更新 更多