【问题标题】:Different default persist for Rdd and DatasetRdd 和 Dataset 的不同默认持久化
【发布时间】:2018-09-01 16:19:34
【问题描述】:

我试图找到一个很好的答案,为什么 RDD 的默认持久化是 MEMORY_ONLY 和数据集 MEMORY_AND_DISK。但是找不到。我想知道你们中是否有人知道背后的充分理由?

谢谢

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    仅仅是因为MEMORY_ONLY 很少有用 - 在实践中,拥有足够的内存来存储所有必需的数据并不常见,因此您经常不得不逐出一些块或仅部分缓存数据。

    DISK_AND_MEMORY 将数据驱逐到磁盘相比,因此不会丢失缓存块。

    SPARK-3824 解释了选择 MEMORY_AND_DISK 作为默认缓存模式的确切原因(Spark SQL 默认应该缓存在 MEMORY_AND_DISK):

    Spark SQL 当前使用 MEMORY_ONLY 作为默认格式。然而,由于使用列缓冲区,必须重新计算块的成本很高,比 Spark 核心要高得多。尤其是现在我们对缓存块更加保守,有时不会缓存我们认为可能超过内存的块,默认情况下将持久块保留在磁盘上似乎很好。

    【讨论】:

      【解决方案2】:

      对于 rdd,persist api 的默认存储级别是 MEMORY,对于数据集,默认存储级别是 MEMORY_AND_DISK

      请检查以下内容

      [SPARK-3824][SQL] 将内存表默认存储级别设置为 MEMORY_AND_DISK

      正如@user6910411 所提到的“Spark SQL 当前使用 MEMORY_ONLY 作为默认格式。但是,由于使用列缓冲区,必须重新计算块的成本很高,比 Spark 核心要高得多。" 即数据集/数据帧 api 使用列缓冲区来存储列数据类型和有关原始数据的列详细信息,因此如果缓存数据不适合内存,则它不会缓存分区的其余部分并重新计算每当需要时。因此,在数据集/数据帧的情况下,由于其柱状结构,与 rdd 相比,重新计算成本更高。因此,默认持久选项更改为 MEMORY_AND_DISK 以便不适合内存的块将溢出到磁盘并且它将在需要时从磁盘中检索,而不是下次重新计算。

      【讨论】:

        猜你喜欢
        • 2016-07-17
        • 1970-01-01
        • 2016-01-16
        • 1970-01-01
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 2019-07-18
        • 1970-01-01
        相关资源
        最近更新 更多