Spark最重要的一个功能,就是在不同操作间,持久化(或缓存)一个数据集在内存中。当你持久化一个RDD,每一个结点都将
把它的计算分块结果保存在内存中,并在对此数据集(或者衍生出的数据集)进行的其它动作中重用。这将使得后续的动作
(Actions)变得更加迅速(通常快10倍)。缓存是用Spark构建迭代算法的关键。
在Spark中,cache和persist用于将RDD持久化到缓存中
其中cache采取persist的默认存储级别StorageLevel.MEMORY_ONLY
def cache(): this.type = persist()
def persist(): this.type = persist(StorageLevel.MEMORY_ONLY)
def persist(newLevel:StorageLevel):this.type = {
if(isLocallyCheckpointed){
persist(LocalRDDCheckpointData.transformStorageLevel(newLevel),allowOverride = true)
} else {
persist(newLevel, allowOverride = false)
}
}
StorageLevel支持多种持久化级别
package org.apache.spark.api.java;
import org.apache.spark.storage.StorageLevel;
public class StorageLevels {
public static final StorageLevel NONE = create(false,false,false,false,1);
public static final StorageLevel DISK_ONLY = create(true,false,false,false,1);
public static final StorageLevel DISK_ONLY_2 = create(true,false,false,false,2);
public static final StorageLevel MEMORY_ONLY = create(false,true,false,true,1);
public static final StorageLevel MEMORY_ONLY_2 = create(false,true,false,true,2);
public static final StorageLevel MEMORY_ONLY_SER = create(false,true,false,false,1);
public static final StorageLevel MEMORY_ONLY_SER_2 = create(false,true,false,false,2);
public static final StorageLevel MEMORY_AND_DISK = create(true,true.false,true,1);
public static final StorageLevel MEMORY_AND_DISK_2 = create(true,true,false,true,2);
public static final StorageLevel MEMORY_AND_DISK_SER = create(true,true,false,false,1);
public static final StorageLevel MEMORY_AND_DISK_SER_2 = create(true,true,false,false,2);
public static final StorageLevel OFF_HEAP = create(true,true,true,false,1);
public static StorageLevel create(
boolean useDisk,
boolean useMemory,
boolean useOffHeap,
boolean deserialized,
int replication) {
return StorageLevel.apply(useDisk,useMemory,useOffHeap,
deserialized,replication);
}
}
不同持久化级别的性能比较,存储级别末尾加上“_2”来将持久化数据存为两份
级别 | 内存空间 | CPU时间 | 是否在内存 | 是否在磁盘 |
MEMORY_ONLY | 高 | 低 | 是 | 否 |
MEMORY_ONLY_SER | 低 | 高 | 是 | 否 |
MEMORY_AND_DISK | 高 | 中等 | 部分 | 部分 |
MEMORY_AND_DISK_SER | 低 | 高 | 部分 | 部分 |
DISK_ONLY | 低 | 高 | 否 | 是 |