Spark的Driver高可用HA

Driver HA

  • 针对 Standalone 集群。相当于SparkContext(Driver)
  • Driver HA 当Driver死掉会重新启动一个新的Driver

第一步在提交application的时候添加 - - supervise(Standalone 集群才有的)选项,如果Driver挂掉会自动启动-个Driver
但 :这种启动的Driver 并不知道集群处理到什么位置,也不知道处理的逻辑是什么,所以容易造成数据重复消费。。
第二步:必须在代码中恢复Driver(SparkStreamingContext)

object SparkStreamingDriverHA {
  //设置checkpoint目录
  val ckDir = "./data/streamingCheckpoint"
  def main(args: Array[String]): Unit = {

    /**
      * StreamingContext.getOrCreate(ckDir,CreateStreamingContext)
      *   这个方法首先会从ckDir目录中获取StreamingContext【 因为StreamingContext是序列化存储在Checkpoint目录中,恢复时会尝试反序列化这些objects。
      *   如果用修改过的class可能会导致错误,此时需要更换checkpoint目录或者删除checkpoint目录中的数据,程序才能起来。】
      *
      *   若能获取回来StreamingContext,就不会执行CreateStreamingContext这个方法创建,否则就会创建
      *
      */
    val ssc: StreamingContext = StreamingContext.getOrCreate(ckDir,CreateStreamingContext)
    ssc.start()
    ssc.awaitTermination()
    ssc.stop()

  }
--------------------------------------------------------------------------------------------------
  def CreateStreamingContext() = {
    println("=======Create new StreamingContext =======")
    val conf = new SparkConf()
    conf.setMaster("local")
    conf.setAppName("DriverHA")
    val ssc: StreamingContext = new StreamingContext(conf,Durations.seconds(5))
    ssc.sparkContext.setLogLevel("Error")

    /**
      *   默认checkpoint 存储:
      *     1.配置信息
      *   	2.DStream操作逻辑
      *   	3.job的执行进度
      *     4.offset
      */
    ssc.checkpoint(ckDir)
    val lines: DStream[String] = ssc.textFileStream("./data/streamingCopyFile")
    val words: DStream[String] = lines.flatMap(line=>{line.trim.split(" ")})
    val pairWords: DStream[(String, Int)] = words.map(word=>{(word,1)})
    val result: DStream[(String, Int)] = pairWords.reduceByKey((v1:Int, v2:Int)=>{v1+v2})

    result.print()

    /**
      * 更改逻辑
      */
//    result.foreachRDD(pairRDD=>{
//      pairRDD.filter(one=>{
//        println("*********** filter *********")
//        true
//      })
//      pairRDD.foreach(println)
//    })
    ssc
  }
  • 1.如果是从checkpoint目录恢复到的StramingContext,就说明你Driver挂掉了,你再去从checkpoint目录中恢复StteamingContext 不管你怎么改逻辑都不会执行。。

  • 2.如果你是时时用的 textFileStream来监控目录。那么你这个目录的文件不能删除不能停止。。

  • 3.想要执行新逻辑 要么清空目录,要么换一个checkpoint目录

  • 4.当你从目录中恢复Driver的时候,一定会造成数据重复消费。会把最近的几个批次,重复消费。

  • 使用场景:当集群维护,并且不修改逻辑的情况下,非常适合使用这种方法

下篇文章手动管理offset

发布了19 篇原创文章 · 获赞 5 · 访问量 481

猜你喜欢

转载自blog.csdn.net/qq_42890382/article/details/104511934