spark streaming 如何自动停止
问题
众所周知spark streaming是7*24小时实时运行的程序。但是如果业务场景就是某天的某个时间段需要使用呢?时间点时长不固定。这个时候就需要我们代码逻辑上启动与停止spark streaming程序了。
1.启动
对于spark(streaming)程序,我们通常是用shell脚本进行启动,而脚本的调用通常是由crontab或者调度系统例如azkaban定时启动,当然azkaban还有创建依赖等等功能。
如果我们的程序触发条件是由某个主动行为,而非固定时间点或者是依赖某个任务呢?比如我想调个接口就可以启动spark程序?留坑:spark的启动
2.停止
废话不多说,上代码:
//临时实时消费程序,在RDD连续五次没有数据那么就自杀
var flag_null_cnt = 0
DStream.foreachRDD { rdd =>
if(!rdd.isEmpty()){
DataAccess.Dataprocess(rdd,spark,path,className)
flag_null_cnt = 0
}else{
if(flag_null_cnt == 5){
ssc.stop(false,false)
System.exit(1)
}else{
flag_null_cnt=flag_null_cnt+1
}
}
}
比如以上代码,逻辑很简单,五次batch都没有数据了,就停止程序,ssc.stop还不放心,又加了个System.exit(1)来退出jvm。
讲道理,这样做应该是可以的。但是我在这么做的时候遇到一个诡异的问题。
在程序应该停止的时候,yarn上显示程序还是running,但是打开spark ui显示http error 500已经不存在了。
日志如下:
其实解决的方法很简单。
相关issues
设置spark参数
spark.streaming.stopGracefullyOnShutdown = ture
conf.set("spark.streaming.stopGracefullyOnShutdown","true")
也就是所谓的优雅的停止
【实战篇】如何优雅的停止你的 Spark Streaming Application