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 中元数据包括:
- 创建应用程序的配置信息。
- DStream 的操作逻辑。
- 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
}
}