缓存

1. cache/persist

Spark 中一个很重要的能力是将数据persisting持久化(或称为caching缓存),在多个操作间都可以访问这些持久化的数据。

当持久化一个 RDD 时,每个节点的其它分区都可以使用 RDD 在内存中进行计算,在该数据上的其他 action 操作将直接使用内存中的数据。

这样会让以后的 action 操作计算速度加快(通常运行速度会加速 10 倍)。缓存是迭代算法和快速的交互式使用的重要工具。

数据将会在第一次 action 操作时进行计算,并缓存在节点的内存中。

Spark 的缓存具有容错机制,如果一个缓存的 RDD 的某个分区丢失了,Spark 将按照原来的计算过程,自动重新计算并进行缓存。

RDD通过persist方法或cache方法可以将前面的计算结果缓存,但是并不是这两个方法被调用时立即缓存,而是触发后面的action时,该RDD将会被缓存在计算节点的内存中,并供后面重用。

2.checkpoint

checkpoint的意思就是建立检查点

例如在spark计算里面 计算流程DAG特别长,服务器需要将整个DAG计算完成得出结果,但是如果在这很长的计算流程中突然中间算出的数据丢失了,spark又会根据RDD的依赖关系从头到尾计算一遍,这样子就很费性能,

当然我们可以将中间的计算结果通过cache或者persist放到内存或者磁盘中,但是这样也不能保证数据完全不会丢失,存储的这个内存出问题了或者磁盘坏了,也会导致spark从头再根据RDD计算一遍,所以就有了checkpoint,

其中checkpoint的作用就是将DAG中比较重要的中间数据做一个检查点将结果存储到一个高可用的地方(通常这个地方就是HDFS里面)

 

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object pointKey {
  def main(args: Array[String]): Unit = {

    val conf: SparkConf = new SparkConf().setAppName("My scala word count").setMaster("local")
    val sc = new SparkContext(conf)
    //设定检查点的保存目录
    sc.setCheckpointDir("cp")

    val rdd: RDD[Int] = sc.makeRDD(List(1,2,3,4),3)

    //cache 方法调用指示在下次计算 RDD 后,要把 RDD 存储起来。
    val cacherdd: RDD[Int] = rdd.cache()
    //调用count 会导致第一次计算 RDD。
    println(cacherdd.count())
    //调用 take 时,访问的是 cached 已经缓存好的元素,而不是从 cached 的依赖关系中重新计算出来的。
    println(cacherdd.take(2))




    val maprdd: RDD[(Int, Int)] = rdd.map(x=>(x,1))
    val reduceByKeyrdd: RDD[(Int, Int)] = maprdd.reduceByKey((x,y)=>(x+y))
    reduceByKeyrdd.collect().foreach(println)
    println(reduceByKeyrdd.toDebugString)
//    (3,1)
//    (4,1)
//    (1,1)
//    (2,1)
//    (3) ShuffledRDD[2] at reduceByKey at pointKey.scala:15 []
//    +-(3) MapPartitionsRDD[1] at map at pointKey.scala:13 []
//    |  ParallelCollectionRDD[0] at makeRDD at pointKey.scala:12 []


    val maprdd2: RDD[(Int, Int)] = rdd.map(x=>(x,2))
    maprdd2.checkpoint()

    val reduceByKeyrdd2: RDD[(Int, Int)] = maprdd2.reduceByKey((x,y)=>(x+y))
    reduceByKeyrdd2.collect().foreach(println)
    println(reduceByKeyrdd2.toDebugString)

//    (3,2)
//    (4,2)
//    (1,2)
//    (2,2)
//    (3) ShuffledRDD[4] at reduceByKey at pointKey.scala:32 []
//    +-(3) MapPartitionsRDD[3] at map at pointKey.scala:29 []
//    |  ReliableCheckpointRDD[5] at collect at pointKey.scala:33 []


  }

}

 

 

 



posted on 2020-09-30 10:34  happygril3  阅读(210)  评论(0)    收藏  举报

导航