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