spark中的memory_only和memory_and_disk缓存级别的行为有何不同?
答案 0 :(得分:31)
文件说---
存储级别
含义
MEMORY_ONLY
将RDD存储为JVM中的反序列化Java对象。如果RDD没有 适合内存,一些分区将不会被缓存,将是 每次需要时都会重新计算。这是默认值 水平。
MEMORY_AND_DISK
将RDD存储为JVM中的反序列化Java对象。如果RDD没有 适合内存,存储不适合磁盘的分区,然后读取 他们需要时从那里来。
MEMORY_ONLY_SER
将RDD存储为序列化Java对象(每个分区一个字节数组)。 这通常比反序列化的对象更节省空间, 特别是在使用快速串行器时,但CPU占用更多 读。
MEMORY_AND_DISK_SER
与MEMORY_ONLY_SER类似,但溢出不适合的分区 内存到磁盘而不是每次都重新计算它们 他们是需要的。
DISK_ONLY
仅将RDD分区存储在磁盘上。
MEMORY_ONLY_2,MEMORY_AND_DISK_2等
与上面的级别相同,但复制两个群集上的每个分区 节点。
OFF_HEAP(实验性)
在Tachyon中以序列化格式存储RDD。相比 MEMORY_ONLY_SER,OFF_HEAP减少了垃圾收集开销 允许执行程序更小并共享一个内存池,使 它在大堆或多个并发的环境中很有吸引力 应用。此外,由于RDD驻留在Tachyon,崩溃 执行程序不会导致丢失内存缓存。在这种模式下, Tachyon的记忆是可废弃的。因此,Tachyon不会尝试 重建一个从记忆中驱逐的块。
这意味着只有内存,spark会尝试始终将分区保留在内存中。如果某些分区无法保留在内存中,或者由于节点丢失,某些分区将从RAM中删除,则spark将使用沿袭信息重新计算。在内存和磁盘级别,spark将始终保持计算和缓存分区。它将尝试保留在RAM中,但如果它不适合,则分区将溢出到磁盘。
答案 1 :(得分:27)
正如documentation中所述,效率方面的持久性水平:
Level Space used CPU time In memory On disk Serialized ------------------------------------------------------------------------- MEMORY_ONLY High Low Y N N MEMORY_ONLY_SER Low High Y N Y MEMORY_AND_DISK High Medium Some Some Some MEMORY_AND_DISK_SER Low High Some Some Y DISK_ONLY Low High N Y Y如果有太多数据无法容纳在内存中,
MEMORY_AND_DISK
和MEMORY_AND_DISK_SER
会溢出到磁盘。