Spark

Spark内存储级别性能测试及其选择

2018-10-04  本文已影响591人  Michael孟良

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及不必要的内存消耗,提升程序性能。


StorageLevel的选择

经过上面的数据,我们可以得出:
1.第一个优先选择MEMORY_ONLY ,从数据上看,读最快(32691 ms)。
2.第二个优先选择MEMORY_ONLY_SER 。当空间不够,可以选择MEMORY_ONLY_SER,加多了序列化步骤,但节约了空间。
3.第三个优先选择MEMORY_AND_DISK_SER ,当空间再不够,才选择将部分放到磁盘。
4.不建议用DISK_ONLY ,用了60397 ms,还不如MEMORY_ONLY在文件中重新读一遍(71126 ms);而其读文件要用146601 ms,相当其他读文件的一倍。

Thanks for watching!

上一篇 下一篇

猜你喜欢

热点阅读