Driver HA高可用 实现

Driver HA(Standalone 或者 Mesos)

因为 SparkStreaming 是 7*24 小时运行,Driver 只是一个简单的进程,有可能挂掉,所以实现 Driver 的 HA 就有必要(如果使用的 Client 模式就无法实现 Driver HA ,这里针对的是 cluster 模式)。Yarn 平台 cluster 模式提交任务,AM(AplicationMaster)相当于 Driver,如果挂掉会自动启动AM。这里所说的 DriverHA 针对的是 Spark standalone 和 Mesos 资源调度的情况下。实现 Driver 的高可用有两个步骤:
第一:提交任务层面,在提交任务的时候加上选项 --supervise,当 Driver挂掉的时候会自动重启 Driver。
第二:代码层面,使用 JavaStreamingContext.getOrCreate(checkpoint 路径,JavaStreamingContextFactory)

  • Driver 中元数据包括:
  1. 创建应用程序的配置信息。
  2. DStream 的操作逻辑。
  3. job 中没有完成的批次数据,也就是 job 的执行进度。
    示例代码:
import org.apache.spark.SparkConf
import org.apache.spark.streaming.dstream.DStream
import org.apache.spark.streaming.{Durations, StreamingContext}

/**
 * Driver  HA 实现:
 * Driver HA 实现有两个层面:
 * 1.在提交Spark 任务时 指定参数 --supervise ,当Driver挂掉会自动重启
 * 2.代码中实现Driver HA 回复对应的 配置、执行逻辑、数据处理位置信息。
 *
 * 利用checkpoint实现,checkpoint 中存储数据:
 * 1.SparkStreaming的配置信息
 * 2.SparkStreaming执行逻辑
 * 3.SparkStreaming处理数据批次
 * StreamingContext.getOrCreate(ckdir,createStreamingContext) :
 * 首先从checkpoint目录中获取对应的数据信息回复StreamingContext,如果不能回复可以根据  createStreamingContext 来创建StreamingContext对象。
 *
 * 我们可以利用SparkStreaming Driver HA 恢复数据处理的位置,但是这种方式有问题:
 * 1).将旧的执行逻辑同时恢复过来,如果代码逻辑改变,新的代码逻辑不能执行,这种方式有局限性。
 * 2).这种利用checkpoint方式来恢复数据处理位置,会将最近处理过的批次重复读取,会造成重复数据处理。这种方式有局限性。
 */


object DriverHa {
  var ckDir = ""

  def main(args: Array[String]): Unit = {
    StreamingContext.getOrCreate(ckDir, createStreamingContext)
     
  }

  def createStreamingContext(): StreamingContext = {
    println("********* create new streamingContext *********")
    val conf = new SparkConf()
    conf.setMaster("local")
    conf.setAppName("test")
    val ssc = new StreamingContext(conf, Durations.seconds(5))
    ssc.sparkContext.setLogLevel("Error")
    ssc.checkpoint(ckDir)
    val lines: DStream[String] = ssc.textFileStream("./data/streamingCopyFile")
    val words = lines.flatMap(line => {
      line.split(" ")
    })
    val pairWords = words.map(word => {
      (word, 1)
    })
    val result = pairWords.reduceByKey((v1, v2) => {
      v1 + v2
    })
    //    result.map(tp=>{
    //      println("*******************"+tp)
    //      tp._1+"_"+tp._2
    //    }).print()
    result.print()
    ssc
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值