Apache spark Rdd和Dataset的不同默认持久性
我试图找到一个很好的答案,为什么RDD的默认persist是MEMORY_ONLY,而数据集MEMORY_和磁盘的默认persist。但是找不到它。我想知道你们当中是否有人知道背后的原因Apache spark Rdd和Dataset的不同默认持久性,apache-spark,Apache Spark,我试图找到一个很好的答案,为什么RDD的默认persist是MEMORY_ONLY,而数据集MEMORY_和磁盘的默认persist。但是找不到它。我想知道你们当中是否有人知道背后的原因 感谢仅仅因为内存\u ONLY很少有用-实际上,拥有足够的内存来存储所有所需的数据并不常见,因此您通常需要逐出一些块或仅部分缓存数据 与之相比,磁盘和内存将数据逐出磁盘,因此不会丢失缓存块 选择MEMORY\u和\u DISK作为默认缓存模式的确切原因解释如下:(默认情况下,Spark SQL应该缓存在MEMO
感谢仅仅因为
内存\u ONLY
很少有用-实际上,拥有足够的内存来存储所有所需的数据并不常见,因此您通常需要逐出一些块或仅部分缓存数据
与之相比,磁盘和内存将数据逐出磁盘,因此不会丢失缓存块
选择MEMORY\u和\u DISK
作为默认缓存模式的确切原因解释如下:(默认情况下,Spark SQL应该缓存在MEMORY\u和\u DISK
中):
Spark SQL目前仅将内存_用作默认格式。然而,由于使用列缓冲区,重新计算块的成本非常巨大,远高于Spark core。特别是因为现在我们对缓存块比较保守,而且有时不会缓存我们认为可能会超出内存的块,所以默认情况下最好将持久化块保留在磁盘上
对于rdd,持久化api的默认存储级别是内存,而对于dataset,默认存储级别是内存和磁盘 请检查以下内容 [SPARK-3824][SQL]将内存表中的默认存储级别设置为内存和磁盘 正如@user6910411所提到的“Spark SQL目前仅使用内存作为默认格式。但是,由于使用列缓冲区,重新计算块的成本非常高,远高于Spark core。”也就是说,dataset/dataframe API使用列缓冲区来存储关于原始数据的列datattype和列详细信息,因此,如果缓存数据不适合内存,那么它将不会缓存分区的其余部分,并在需要时重新计算。因此,在dataset/dataframe的情况下,由于以下原因,与rdd相比,重新计算的成本更高:因此,默认的persist选项更改为MEMORY_和_DISK,这样不适合内存的块将溢出到磁盘,并在需要时从磁盘检索,而不是下次重新计算