累加器和广播变量
累加器(Accumulators)和广播变量(Broadcast variables) 不能从Spark Streaming的检查点中恢复
逻辑单词计数 中间宕机,7*2不间断运行
如果用了累加器 从1 累加到10 宕机 数据不能从缓存中拿数据 只能重新计算
创建的时候 要使用单例模式
如果你启用检查并也使用了累加器和广播变量,
那么你必须创建累加器和广播变量的延迟单实例从而在驱动因失效重启后他们可以被重新实例化。
案例:
package com.bw.streaming.day03 import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.broadcast.Broadcast import org.apache.spark.streaming.{Seconds, StreamingContext} import org.apache.spark.util.LongAccumulator //使用广播变量和累加器来监控敏感词汇出现次数 object WordBlakList { def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName(s"${this.getClass.getSimpleName}").setMaster("local[2]") val ssc = new StreamingContext(conf,Seconds(2)) //获取socket流 val stream = ssc.socketTextStream("linux04",9999) //业务处理 stream.foreachRDD(r=>{ //从广播变量中获取敏感词汇 val words: Seq[String] = WordBlackListBC.getInstance(r.sparkContext).value //使用累加器计算敏感词汇出现的次数 val accum: LongAccumulator = WordBlackListAccum.getInstance(r.sparkContext) r.foreach(t => { if (words.contains(t)) { accum.add(1) } }) println("敏感词汇:"+accum.value) }) ssc.start() ssc.awaitTermination() } } //object 是单例模式 object WordBlackListBC{ @volatile private var instance:Broadcast[Seq[String]]=null def getInstance(sc:SparkContext):Broadcast[Seq[String]]={ if(instance==null){ synchronized{ if(instance==null){ instance= sc.broadcast(Seq("a","c")) } } } instance } } //累加器 object WordBlackListAccum{ @volatile private var instance: LongAccumulator = null def getInstance(sc: SparkContext): LongAccumulator = { if (instance == null) { synchronized { if (instance == null) { instance = sc.longAccumulator("WordsInBlacklistCounter") } } } instance } }
2.DataFream ans SQL Operations
你 可 以 很 容 易 地 在 流 数 据 上 使 用 DataFrames 和 SQL 。 你 必 须 使 用
SparkContext 来创建 StreamingContext 要用的 SQLContext。此外,这一过程可
以在驱动失效后重启。我们通过创建一个实例化的 SQLContext 单实例来实现
这个工作。如下例所示。我们对前例 word count 进行修改从而使用 DataFrames
和 SQL 来产生 word counts。每个 RDD 被转换为 DataFrame,以临时表格配置
并用 SQL 进行查询。