spark streaming 如何自动停止

本文介绍如何根据特定条件启动与停止 SparkStreaming 应用,包括通过接口调用启动程序,以及当连续五个批次无数据输入时,优雅地停止程序的方法。文章解决了在非固定时间点触发程序启停的需求,并分享了解决程序停止后YARN仍显示运行状态的诡异问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

众所周知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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值