我试图找到一个很好的答案,为什么RDD的默认持久性为MEMORY_ONLY,数据集的默认持久性为MEMORY_AND_DISK。但是找不到它。我想知道你们当中有人知道背后的充分理由吗?
谢谢
答案 0 :(得分:4)
仅因为MEMORY_ONLY
很少有用-实际上没有足够的内存来存储所有必需数据的情况并不常见,因此您通常不得不逐出某些块或仅部分缓存数据。< / p>
与DISK_AND_MEMORY
将数据逐出磁盘相比,因此不会丢失任何缓存块。
选择MEMORY_AND_DISK
作为默认缓存模式的确切原因由SPARK-3824解释( Spark SQL默认应在MEMORY_AND_DISK
中缓存):< / p>
Spark SQL当前使用MEMORY_ONLY作为默认格式。但是,由于使用了列缓冲区,因此必须重新计算块会付出巨大的代价,比Spark核心要多得多。尤其是由于现在我们对缓存块更加保守,有时我们认为缓存可能不会超出内存,因此默认情况下将持久块保留在磁盘上似乎很好。
答案 1 :(得分:1)
对于rdd,持久性api的默认存储级别为MEMORY,数据集的默认存储级别为MEMORY_AND_DISK
请检查以下内容
[SPARK-3824] [SQL]将内存表默认存储级别设置为MEMORY_AND_DISK
如@ user6910411所提及,“ Spark SQL当前使用MEMORY_ONLY作为默认格式。但是,由于使用了列缓冲区,必须重新计算块会付出巨大的代价,比Spark核心要多得多。” / strong>”,即数据集/数据框api使用列缓冲区来存储有关原始数据的列数据类型和列详细信息,以便万一将数据缓存到内存中时不会缓存其余分区并重新计算因此,在数据集/数据帧的情况下,由于其列结构,与rdd相比,重新计算成本更高。因此默认的persist选项更改为MEMORY_AND_DISK,因此不适合内存的块将溢出到磁盘上,并且将在需要时从磁盘中检索,而无需下次重新计算。