Spark RDD持久化
Spark提供了一种方便的方式来对数据集进行持久化,将其存储在内存中,跨操作进行处理。在持久化RDD时,每个节点都会将其计算的分区存储在内存中。现在,我们可以在该数据集上的其他任务中重复使用它们。
我们可以使用persist()或cache()方法来标记要持久化的RDD。Spark的缓存是容错的。在任何情况下,如果一个RDD的分区丢失了,它将自动使用最初创建它的转换重新计算。
有几种不同的存储级别可用于存储持久化的RDD。通过将StorageLevel对象(Scala、Java、Python)传递给persist()方法来使用这些级别。然而,cache()方法用于默认的存储级别,即StorageLevel.MEMORY_ONLY。
以下是一组存储级别:
存储级别 | 描述 |
---|---|
MEMORY_ONLY | 将RDD作为JVM中的反序列化Java对象存储。这是默认级别。如果RDD无法全部放入内存中,某些分区将不会被缓存,每次需要时都会重新计算。 |
MEMORY_AND_DISK | 将RDD作为JVM中的反序列化Java对象存储。如果RDD无法全部放入内存中,将那些无法放入内存的分区存储在磁盘上,并在需要时从磁盘上读取。 |
MEMORY_ONLY_SER (Java和Scala) | 将RDD作为序列化的Java对象存储(即每个分区一个字节数组)。一般来说,这比反序列化的对象更节省空间。 |
MEMORY_AND_DISK_SER (Java和Scala) | 它与MEMORY_ONLY_SER类似,但是将无法放入内存的分区溢写到磁盘上,而不是重新计算它们。 |
DISK_ONLY | 仅将RDD分区存储在磁盘上。 |
MEMORY_ONLY_2, MEMORY_AND_DISK_2,等等 | 与上述级别相同,但每个分区在两个集群节点上复制。 |
OFF_HEAP(实验性) | 它与MEMORY_ONLY_SER类似,但数据存储在非堆内存中。非堆内存必须启用。 |