Scala之持久化

package com.uplooking.bigdata.core.p3
 
import org.apache.spark.rdd.RDD
import org.apache.spark.storage.StorageLevel
import org.apache.spark.{SparkConf, SparkContext}
 
/**
  * 关于RDD持久化的操作
  *
  * 如何选择一个持久化的策略:
  *      首先应该想到使用MEMORY_ONLY,数据都未经过序列化存放在JVM内存中,这个有缺点
  *   不能存放海量数据,容易发生频繁GC导致性能低下,还有可能出现OOM(Out Of Memory)异常
  *      如果MEMORY_ONLY搞不定,则可以尝试MEMORY_ONLY_SER,在MEMORY_ONLY的基础之上
  *   对数据进行序列化,这个时候rdd中的每一个partition被序列化成为一个byte[]保存在JVM中
  *   使用的时候直接对该byte[]进行反序列化即可。所以这样就给我们的程序带了的序列化和反序列化
  *   性能开销,有应为数据都保存在内存中,同样也会出现上述频繁GC,进而OOM
  *     上述数据没有被持久化的数据,在下次使用的时候是从源头重新计算的。
  *     如果MEMORY_ONLY_SER搞不定,就尝试使用MEMORY_AND_DISK_SER,就不要MEMORY_AND_DISK,
  *   道理和上述一致。
  *     另外两种DISK_ONLY和xxx_2这两种持久化策略,不见大家使用,原因:DISK_ONLY慢的要死,
  *   有时候还不如重新计算,性能低下;xxx_2需要将数据备份一份到别的节点,需要大量的网络IO开销,
  *   如果当前节点挂点,还要从别的节点传输一份过来,就又造成了大量的Net IO性能也非常低,不建议使用
  *   除非对数据的完整性、安全、可靠性要求非常高,还有占用更多的存储资源
  */
object ScalaSparkPersistApp {
  def main(args: Array[String]): Unit = {
    val conf:SparkConf = new SparkConf()
        .setAppName("ScalaSparkPersistApp")
        .setMaster("local")
    val sc:SparkContext = new SparkContext(conf)
 
    val linesRDD:RDD[String] = sc.textFile("E:\\test\\spark\\streaming\\access_2016-05-30.log")
//    linesRDD.cache()
    linesRDD.persist(StorageLevel.MEMORY_ONLY)
    var start = System.currentTimeMillis()
    val list = linesRDD.take(1)
    println("take方式取出listRDD中的第一条记录" + list)
    println("take方式消耗的时间:" + (System.currentTimeMillis() - start))
 
 
    start = System.currentTimeMillis()
    val first = linesRDD.first()
    println("first方式取出listRDD中的第一条记录" + first)
    println("first方式消耗的时间:" + (System.currentTimeMillis() - start))
 
 
    //对持久化数据的卸载
//    linesRDD.unpersist(true)
 
 
 
 
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值