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)
}
}
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)
}
}