CacheTest

package com.bjsxt.scala.spark.test

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.storage.StorageLevel

object CacheTest {
  def main(args: Array[String]): Unit = {
    
    val conf = new SparkConf()
    conf.setMaster("local")
    conf.setAppName("CacheTest")
    
    
    val sc = new SparkContext(conf)
    var rdd = sc.textFile("d:/wc.txt")
    
    /**
     * 第一个job计算的数据依然来源于磁盘
     * cache是persist的一个简化版
     * rdd.persist(StorageLevel.MEMORY_ONLY) = rdd.cache()
     * DISK_ONLY:将RDD的数据持久化到磁盘上
     * MEMORY_ONLY::将RDD的数据持久化到内存上
     * DISK_ONLY_2:将RDD的数据持久化到磁盘上,并且有两个备份  数据更安全了
     * MEMORY_ONLY_2:将RDD的数据持久化到内存上,并且有两个备份  数据更安全了
     * MEMORY_ONLY_SER:将数据进行序列化后在保存到内存中,更节省内存了,但是在使用数据的时候要进行反序列化,消耗cpu资源
     * MEMORY_ONLY_SER_2:将数据进行序列化后在保存到内存中,并且有两个备份
     * MEMORY_AND_DISK:将RDD的数据先往内存中存储,如果内存不足在写入到磁盘上,并不是内存一份磁盘一份
     * MEMORY_AND_DISK_2:....
     * MEMORY_AND_DISK_SER:将数据进行序列化后先往内存中存储,如果内存不足在写入到磁盘上
     * 
     * 问题1:如果选用cache算子,内存不足怎么办?
     * 		内存不足,数据直接丢失,不会出现OO没问题
     * 问题2:如果数据在进行吃计划的时候,数据丢失了,会不会有计算不准的问题?
     * 		不会!!!,因为RDD是由依赖关系的,数据丢了,可以基于父RDD重新计算过来
     * 问题3:在持久化的时候如果选用的持久化级别是MEMORY_AND_DISK,RDD中一个partition的计算结果是否可能保存到内存一部分,磁盘一部分呢?
     * 		没有,持久化的单位是partition的计算结果,这个partition的数据要么全部保存到内存,要么全部保存到磁盘
     */
    rdd = rdd.persist(StorageLevel.DISK_ONLY_2)
    val statTime = System.currentTimeMillis()
    val count = rdd.count()
    val endtime = System.currentTimeMillis()
    println("durations:" + (endtime-statTime) + "\tresult:" + count)
    
    /**
     *  第二个job计算的数据依然来源于内存
     */
    val statTime1 = System.currentTimeMillis()
    val count1 = rdd.count()
    val endtime1 = System.currentTimeMillis()
    println("durations:" + (endtime1-statTime1) + "\tresult:" + count1)
    
    sc.stop()          
  }
}

  

posted @ 2018-06-23 16:48  uuhh  阅读(147)  评论(0)    收藏  举报