【发布时间】:2018-09-01 16:19:34
【问题描述】:
我试图找到一个很好的答案,为什么 RDD 的默认持久化是 MEMORY_ONLY 和数据集 MEMORY_AND_DISK。但是找不到。我想知道你们中是否有人知道背后的充分理由?
谢谢
【问题讨论】:
标签: apache-spark
我试图找到一个很好的答案,为什么 RDD 的默认持久化是 MEMORY_ONLY 和数据集 MEMORY_AND_DISK。但是找不到。我想知道你们中是否有人知道背后的充分理由?
谢谢
【问题讨论】:
标签: apache-spark
仅仅是因为MEMORY_ONLY 很少有用 - 在实践中,拥有足够的内存来存储所有必需的数据并不常见,因此您经常不得不逐出一些块或仅部分缓存数据。
与DISK_AND_MEMORY 将数据驱逐到磁盘相比,因此不会丢失缓存块。
SPARK-3824 解释了选择 MEMORY_AND_DISK 作为默认缓存模式的确切原因(Spark SQL 默认应该缓存在 MEMORY_AND_DISK 中):
Spark SQL 当前使用 MEMORY_ONLY 作为默认格式。然而,由于使用列缓冲区,必须重新计算块的成本很高,比 Spark 核心要高得多。尤其是现在我们对缓存块更加保守,有时不会缓存我们认为可能超过内存的块,默认情况下将持久块保留在磁盘上似乎很好。
【讨论】:
对于 rdd,persist api 的默认存储级别是 MEMORY,对于数据集,默认存储级别是 MEMORY_AND_DISK
请检查以下内容
[SPARK-3824][SQL] 将内存表默认存储级别设置为 MEMORY_AND_DISK
正如@user6910411 所提到的“Spark SQL 当前使用 MEMORY_ONLY 作为默认格式。但是,由于使用列缓冲区,必须重新计算块的成本很高,比 Spark 核心要高得多。" 即数据集/数据帧 api 使用列缓冲区来存储列数据类型和有关原始数据的列详细信息,因此如果缓存数据不适合内存,则它不会缓存分区的其余部分并重新计算每当需要时。因此,在数据集/数据帧的情况下,由于其柱状结构,与 rdd 相比,重新计算成本更高。因此,默认持久选项更改为 MEMORY_AND_DISK 以便不适合内存的块将溢出到磁盘并且它将在需要时从磁盘中检索,而不是下次重新计算。
【讨论】: