【问题标题】:What is the difference between cache and persist?缓存和持久化有什么区别?
【发布时间】:2015-01-08 08:02:27
【问题描述】:

RDD持久化方面,spark中的cache()persist()有什么区别?

【问题讨论】:

    标签: apache-spark distributed-computing rdd


    【解决方案1】:

    使用cache(),您只使用默认存储级别:

    • MEMORY_ONLY 代表 RDD
    • MEMORY_AND_DISK 代表 数据集

    使用 persist(),您可以为 RDDDataset 指定所需的存储级别。

    来自官方文档:

    • 您可以使用persist() 或cache() 方法将RDD 标记为持久化。
    • 每个持久化的RDD 可以使用不同的storage level 存储
    • cache() 方法是使用默认存储级别的简写,即StorageLevel.MEMORY_ONLY(将反序列化的对象存储在内存中)。

    如果您想分配除以下之外的存储级别,请使用persist()

    • MEMORY_ONLY RDD
    • MEMORY_AND_DISK 用于数据集

    官方文档的有趣链接:which storage level to choose

    【讨论】:

    • 请注意,cache() 现在使用 MEMORY_AND_DISK
    • 我不认为上面的评论是正确的。阅读最新的官方文档,使用 ahars 提供的链接与最后一个要点对齐... cache() 方法是使用默认存储级别的简写,即 StorageLevel.MEMORY_ONLY(将反序列化的对象存储在内存中)。跨度>
    • @ximiki , MEMORY_AND_DISK 是仅适用于数据集的默认值。 MEMORY_ONLY 仍然是 RDD 的默认值
    • @user2596560 注释对于数据集的默认缓存值是正确的。您适合仍然保留 MEMORY_ONLY 默认值的 RDD
    【解决方案2】:

    cachepersist 操作之间的区别纯粹是 句法。 cache 是 persist 或 persist(MEMORY_ONLY) 的同义词,即 cache 只是 persist 具有默认存储级别 MEMORY_ONLY

    但是Persist() 我们可以将中间结果保存在 5 个存储级别中。

    1. MEMORY_ONLY
    2. MEMORY_AND_DISK
    3. MEMORY_ONLY_SER
    4. MEMORY_AND_DISK_SER
    5. DISK_ONLY

    /** * 以默认存储级别持久化这个 RDD (MEMORY_ONLY)。 */
    def persist(): this.type = 持久化(StorageLevel.MEMORY_ONLY)

    /** * 以默认存储级别持久化这个 RDD (MEMORY_ONLY)。 */
    def cache(): this.type = persist()

    在此处查看更多详细信息...


    缓存或持久性是用于(迭代和交互式)Spark 计算的优化技术。它们有助于保存临时部分结果,以便在后续阶段重复使用。这些临时结果作为RDDs 因此保存在内存(默认)或更可靠的存储(如磁盘)中和/或复制。 RDDs 可以使用cache 操作进行缓存。它们也可以使用persist 操作进行持久化。

    #persist, cache

    这些函数可用于调整RDD 的存储级别。 在释放内存时,Spark 会使用存储级别标识符 决定应该保留哪些分区。无参数变体 persist() 和 cache() 只是缩写 persist(StorageLevel.MEMORY_ONLY).

    警告:存储级别一旦更改,就不能再更改!


    警告 - 明智地缓存...见 ((Why) do we need to call cache or persist on a RDD)

    仅仅因为你可以在内存中缓存RDD 并不意味着你应该盲目地这样做。根据数据集被访问的次数和所涉及的工作量,重新计算可能比内存压力增加所付出的代价更快。

    不用说,如果你只在没有缓存意义的情况下读取数据集,它实际上会使你的工作变慢。从 Spark Shell 可以看到缓存数据集的大小..

    列出变体...

    def cache(): RDD[T]
     def persist(): RDD[T]
     def persist(newLevel: StorageLevel): RDD[T]
    

    见下例:

    val c = sc.parallelize(List("Gnu", "Cat", "Rat", "Dog", "Gnu", "Rat"), 2)
         c.getStorageLevel
         res0: org.apache.spark.storage.StorageLevel = StorageLevel(false, false, false, false, 1)
         c.cache
         c.getStorageLevel
         res2: org.apache.spark.storage.StorageLevel = StorageLevel(false, true, false, true, 1)
    

    注意: 由于RDDs 的缓存和持久性之间存在非常小的纯语法差异,这两个术语经常互换使用。

    在这里更直观地查看......

    持久化内存和磁盘:

    缓存

    缓存可以在很大程度上提高应用程序的性能。

    【讨论】:

    • 我在一个块中有一个 DF。我怎样才能访问它。
    【解决方案3】:

    没有区别。来自RDD.scala

    /** Persist this RDD with the default storage level (`MEMORY_ONLY`). */
    def persist(): this.type = persist(StorageLevel.MEMORY_ONLY)
    
    /** Persist this RDD with the default storage level (`MEMORY_ONLY`). */
    def cache(): this.type = persist()
    

    【讨论】:

      【解决方案4】:

      Spark 提供 5 种存储级别

      • MEMORY_ONLY
      • MEMORY_ONLY_SER
      • MEMORY_AND_DISK
      • MEMORY_AND_DISK_SER
      • DISK_ONLY

      cache() 将使用MEMORY_ONLY。如果您想使用其他内容,请使用persist(StorageLevel.<*type*>)

      默认persist()会 将数据作为非序列化对象存储在 JVM 堆中。

      【讨论】:

        【解决方案5】:

        Cache() 和 persist() 这两种方法都用于提高 spark 计算的性能。这些方法有助于保存中间结果,以便在后续阶段重复使用。

        cache() 和 persist() 的唯一区别是,使用 Cache 技术,我们可以仅在需要时将中间结果保存在内存中,而在 Persist() 中,我们可以将中间结果保存在 5 个存储级别(MEMORY_ONLY、MEMORY_AND_DISK、MEMORY_ONLY_SER , MEMORY_AND_DISK_SER, DISK_ONLY)。

        【讨论】:

          【解决方案6】:

          对于不耐烦

          相同

          不传参数persist()cache()是一样的,默认设置:

          • RDD: MEMORY_ONLY
          • Dataset:MEMORY_AND_DISK

          区别:

          cache() 不同,persist() 允许您在括号内传递参数,以指定级别:

          • persist(MEMORY_ONLY)
          • persist(MEMORY_ONLY_SER)
          • persist(MEMORY_AND_DISK)
          • persist(MEMORY_AND_DISK_SER )
          • persist(DISK_ONLY )

          瞧!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-04-11
            • 2021-04-28
            • 2017-07-15
            • 2015-04-06
            • 2015-12-16
            • 2011-09-22
            • 2016-05-09
            相关资源
            最近更新 更多