Spark有多种储级别,下面我用数据的方式展示各种存储级别的区别和其选择,希望能给在座各位在工作中或面试中一点帮助!转载请注明出处:Michael孟良
存储级别StorageLevel
如上篇文章所说,当 Execution 空间不足而且 Storage 空间也不足的情况下,Storage 空间如果曾经使用了超过 Unified 默认的 50% 空间的话则超过部份会被强制 drop 掉一部份数据来解决 Execution 空间不足的问题。
drop 后数据会不会丢失主要是看你在程序设置的 storage_level 来决定你是 Drop 到那里。
设计代码:
object CacheTest {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().appName("CacheTest").master("local").getOrCreate()
val sc = spark.sparkContext
var rdd1 = sc.textFile("file:///E:/BigData/wc5")
rdd1 = rdd1.persist(StorageLevel.OFF_HEAP )
val startTime = System.currentTimeMillis()
val count = rdd1.count()
val endTime = System.currentTimeMillis()
val startTime1 = System.currentTimeMillis()
val count1 = rdd1.count()
val endTime1 = System.currentTimeMillis()
println("count:" + count + "\tdurations:" + (endTime-startTime) + " ms")//第一个时间是从文件中读过来的时间
println("count:" + count1 + "\tdurations:" + (endTime1-startTime1) + " ms")//第二个时间是从内存或磁盘读过来的时间
while(true){}
// spark.close()
}
}
下面我们通过http://localhost:4040/storage/,来观察storage_level 分配情况:
val DISK_ONLY = new StorageLevel(true, false, false, false)
val DISK_ONLY_2 = new StorageLevel(true, false, false, false, 2)
count:10851865 durations:146601 ms
count:10851865 durations:60397 ms
val MEMORY_ONLY = new StorageLevel(false, true, false, true)
val MEMORY_ONLY_2 = new StorageLevel(false, true, false, true, 2)
count:10851865 durations:71126 ms
count:10851865 durations:32691 ms
val MEMORY_ONLY_SER = new StorageLevel(false, true, false, false)
val MEMORY_ONLY_SER_2 = new StorageLevel(false, true, false, false, 2)
count:10851865 durations:88367 ms
count:10851865 durations:65296 ms
val MEMORY_AND_DISK = new StorageLevel(true, true, false, true)
val MEMORY_AND_DISK_2 = new StorageLevel(true, true, false, true, 2)
count:10851865 durations:118936 ms
count:10851865 durations:63087 ms
val MEMORY_AND_DISK_SER = new StorageLevel(true, true, false, false)
val MEMORY_AND_DISK_SER_2 = new StorageLevel(true, true, false, false, 2)
count:10851865 durations:148841 ms
count:10851865 durations:60774 ms
val OFF_HEAP = new StorageLevel(true, true, true, false, 1)
count:10851865 durations:127012 ms
count:10851865 durations:60083 ms
备注:
1.以MEMORY_ONLY_2为例,MEMORY_ONLY_2相比于MEMORY_ONLY存储数据的方式是相同的,不同的是会将数据备份到集群中两个不同的节点,其余情况类似。
2.当MEMORY_AND_DISK 时,文件不太大,会优先放到memory为主。
3.以MEMORY_ONLY_SER为例,MEMORY_ONLY_SER比MEMORY_ONLY多做了序列化操作。同样大小的文件放在disk会小很多,和在memory序列化后大小一样。
4.除去使用MEMORY,DISK,还有一种是OFF_HEAP,称之为 使用JVM堆外内存,使用OFF_HEAP的优势在于,在内存有限时,可以减少频繁GC及不必要的内存消耗,提升程序性能。