[Spark]-Streaming-Persist与CheckPoint

1.Persist

  与RDD类似,DStream允许用户将流数据存至内存或磁盘(依据用户设置的持久化级别).

  注意:

    在DStream中,默认是存储到内存中.(RDD默认MEMORY_ONLY)

    对于基于窗口的操作, 如 reduceByWindow 和 reduceByKeyAndWindow 以及基于状态的操作, 如 updateStateByKey,内置是自动保存到内存的.

    对于通过网络接收数据(例如: Kafka, Flume, sockets 等)的输入流, 默认持久性级别被设置为将数据复制到两个节点进行容错 (MEMORY_ONLY_2)

2.CheckPoint

  2.1 概述

    streaming 应用程序必须 24/7 运行, 因此必须对应用逻辑无关的故障(例如, 系统故障, JVM 崩溃等)具有弹性.所以Spark Streaming 需要 checkpoint 足够的信息到容错存储系统, 以便可以从故障中恢复

    checkpoint 有两种类型的数据

      Metadata checkpointing - 将定义 streaming 计算的信息保存到容错存储(如 HDFS)中.这用于从运行 streaming 应用程序的 driver 的节点的故障中恢复.Metadata包括:

        Configuration 用于创建流应用程序的配置

        DStream operations - 定义 streaming 应用程序的 DStream 操作集

        ncomplete batches - 尚未完成的job 排队

      Data checkpointing 生成的 RDD 保存到可靠的存储

        在某些比如状态转换等的转换中,某些RDD是依赖先前的RDD.这可能会导致依赖链很长,CheckPoint可以将之后的RDD直接存储下来以切断这种依赖

  2.2 使用

    首先,为了凭借 CheckPoint 使 Streaming 应用从故障中恢复. Streaming 应用自身应该有从 CheckPoint 中创建StreamContext的能力

    使用 StreamingContext.getOrCreate 可以简化这种行为,如下:   

        val checkPointPath = "D:\\data\\StreamingCheckpoint\\StreamingApp"
        val ssc = StreamingContext.getActiveOrCreate(checkPointPath, ()=>{
            val conf = new SparkConf().setAppName("stream-app").setMaster("local[2]")
            val context = new StreamingContext(conf, Seconds(5))
            context.checkpoint(checkPointPath)
            context
        })

  2.3 注意

    2.3.1 累加器(Accumulators) 与 广播变量(Broadcast Variables)

      CheckPoint无法恢复 累加器(Accumulators) 与 广播变量(Broadcast Variables).

      如果应用使用了 累加器(Accumulators) 与 广播变量(Broadcast Variables),需要为这两者创建延迟实例化的单例,以便Driver失败重启后重新实例化这两者         

 object WordBlacklist {      
          @volatile private var instance: Broadcast[Seq[String]] = null        
          def getInstance(sc: SparkContext): Broadcast[Seq[String]] = {
              if (instance == null) {
                synchronized {
                    if (instance == null) {
                      val wordBlacklist = Seq("a", "b", "c")
                      instance = sc.broadcast(wordBlacklist)
                    }
                }
              }
              instance
          }
        }
        
        object DroppedWordsCounter {       
          @volatile private var instance: LongAccumulator = null
          def getInstance(sc: SparkContext): LongAccumulator = {
              if (instance == null) {
                synchronized {
                    if (instance == null) {
                      instance = sc.longAccumulator("WordsInBlacklistCounter")
                    }
                }
              }
              instance
          }
        }

3.Persist与 CheckPoint 的区别 

  Persist与 CheckPoint 这两者都可以将数据暂存让后面的任务使用.但是这两者还是有很大区别的.

  最根本的区别在于这两者的定位完全不同. Persist定位是执行提速,而CheckPoint定位是容错. 其具体体现

  i).数据容错

    Persist 是允许保存到内存中,甚至允许在内存溢出时直接丢弃

    CheckPoint 只能保存到磁盘.并且是本身支持容错的文件系统(HDFS)

  ii).数据失效处理

   Persist 一旦driver关闭.Persist缓存数据会被清理掉.

   CheckPoint CheckPoint数据会永久保存

      ii).执行机制

      Persist 是一种action.在执行Persist会立即产生计算并将计算结果写入到内存或磁盘

    CheckPoint 是一个独立的Job.它会在某个计算任务完后,开启一个专门的任务来执行将结果保存.所以在CheckPoint中,计算会执行两次(所以建议rdd.cache().CheckPoint())

 

posted @ 2018-07-15 01:15  NightPxy  阅读(474)  评论(0编辑  收藏  举报