如何停止SparkStreaming服务

SparkStreaming知识总结 零基础学Sparkstreaming 阅读详情

      网上的怎么关闭SparkStreaming的文章一大堆,可我还是费了很大的力气才解决了我的问题。

    我们都知道SparkStreaming程序是一个长服务,一旦运转起来不会轻易停掉,那么如果我们想要停掉正在运行的程序应该怎么做呢?
    如果运行的是spark on yarn模式直接使用
            # yarn application -kill taskId 
    暴力停掉sparkstreaming是有可能出现问题的,比如你的数据源是kafka,已经加载了一批数据到sparkstreaming中正在处理,如果中途停掉,这个批次的数据很有可能没有处理完,就被强制stop了,下次启动时候会重复消费或者部分数据丢失。

    如何解决? 

    方案一: Spark1.4之前的版本,需要一个钩子函数(该方案弃用)

                sys.ShutdownHookThread {
                    log.info("Gracefully stopping Spark Streaming Application")
                    ssc.stop(true, true) 
                    log.info("Application stopped") 
                } 

     方案二:Spark 1.4之后的版本(有两种方式,都没有测试过)

          方式一:通过端口号找到主进程然后kill掉 

                        只需要在SparkConf里面设置下面的参数即可:                 
                                sparkConf.set("spark.streaming.stopGracefullyOnShutdown","true") 
                         然后,如果需要停掉sparkstreaming程序时: 
                                (1)登录spark ui页面在executors页面找到driver程序所在的机器 
                                (2)使用ssh命令登录这台机器上,执行下面的命令通过端口号找到主进程然后kill掉 
                                 ss -tanlp | grep 55197|awk '{print $6}'|awk -F, '{print $2}'|xargs kill -15 
                        注意:上面的操作执行后,sparkstreaming程序,并不会立即停止,而是会把当前的批处理里面的数据处理完毕后才会停掉,此间sparkstreaming不会再消费kafka的数据,这样以来就能保证结果不丢和重复。 

             方式二:发送SIGTERM信号到spark驱动程序然后关闭程序

                    首先将  spark.streaming.stopGracefullyOnShutdown  参数设置为true(默认值为false)。Spark中引入此参数来解决正常关机问题。开发人员无需再在代码中调用ssc.stop()。但需要向主程序driver端发送SIGTERM信号。在实践中,我们需要做到以下几点:
                        (1)使用Spark UI找出驱动程序进程在哪个节点上运行。在yarn群集部署模式中,驱动程序进程和AM在同一个容器中运行。 

                        (2)登录该节点并执行  ps -ef | grep java | grep ApplicationMaster  并找出pid。
                                 请注意,根据您的应用程序/环境等,grep字符串可能会有所不同。

                        (3)将SIGTERM发送到进程。

                                 kill-SIGTERM <AM-PID>  
                    Spark驱动程序收到SIGTERM信号后,应该在日志中看到关闭的信息了。

           此外还有一个问题是,spark on yarn模式下,默认情况下,Spark的spark.yarn.maxAppAttempts 参数使用 YARN中yarn.resourcemanager.am.max- attempts中的默认值 ,默认值为2。因此,在第一个AM被kill命令停止后,YARN将自动启动另一个AM 驱动程序,作为高可用,也就是上面的操作你可能要执行两次,才能真能的停掉程序,当然我们也可以在spark-submit期间设置  --conf spark.yarn.maxAppAttempts = 1 驱动程序一次挂掉之后,就真的挂掉了,这样就没有容灾机制了,需要慎重考虑。

      方案三:使用HDFS系统做消息通知(我采用这样方式)

        在驱动程序中,加一段代码,这段代码的作用每隔一段时间可以是10秒也可以是3秒,扫描HDFS上某一个文件,如果发现这个文件存在,就调用StreamContext对象stop方法,自己优雅的终止自己,其实这里HDFS可以换成redis,zk,hbase,db都可以,这里唯一的问题就是依赖了外部的一个存储系统来达到消息通知的目的,如果使用了这种方式后。停止流程序就比较简单了,登录上有hdfs客户端的机器,然后touch一个空文件到指定目录,然后等到间隔的扫描时间到之后,发现有文件存在,就知道需要关闭程序了。

package com.spark.test

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{FileSystem, Path}
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}

object Test {
  val shutdownMarker = "/tmp/spark-test/stop-spark"
  var stopFlag: Boolean = false

  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("stop spark streaming")

    val ssc = new StreamingContext(conf, Seconds(5))
    val file = ssc.textFileStream("/tmp/sparkstreaming")
    val res = file.map { line =>
      val arr = line.split("\t")
      arr(0) + "\t" + arr(2)
    }
    res.saveAsTextFiles("/tmp/stroage")

    ssc.start()
    //检查间隔毫秒
    val checkIntervalMillis = 10000
    var isStopped = false
    while (!isStopped) {
      println("calling awaitTerminationOrTimeout")
      //等待执行停止。执行过程中发生的任何异常都会在此线程中抛出,如果执行停止了返回true,
      //线程等待超时长,当超过timeout时间后,会监测ExecutorService是否已经关闭,若关闭则返回true,否则返回false。
      isStopped = ssc.awaitTerminationOrTimeout(checkIntervalMillis)
      if (isStopped) {
        println("confirmed! The streaming context is stopped. Exiting application...")
      } else {
        println("Streaming App is still running. Timeout...")
      }
      //判断文件夹是否存在
      checkShutdownMarker
      if (!isStopped && stopFlag) {
        println("stopping ssc right now")
        //第一个true:停止相关的SparkContext。无论这个流媒体上下文是否已经启动,底层的SparkContext都将被停止。
        //第二个true:则通过等待所有接收到的数据的处理完成,从而优雅地停止。
        ssc.stop(true, true)
        println("ssc is stopped!!!!!!!")
      }
    }
  }

  def checkShutdownMarker = {
    if (!stopFlag) {
      //开始检查hdfs是否有stop-spark文件夹
      val fs = FileSystem.get(new Configuration())
      //如果有返回true,如果没有返回false
      stopFlag = fs.exists(new Path(shutdownMarker))
    }
  }
}

我一直纠结 awaitTerminationOrTimeout(checkIntervalMillis) 这个方法,对我数据处理是否有影响,查阅大量资料这个方法就是等待执行停止,在执行期间发生的任何异常都会被抛出这个线程。而且检查间隔毫秒其实是线程等待超时时长,当超过timeout时间后,会监测ExecutorService是否已经关闭,若关闭则返回true,否则返回false。还有我在测试的时候,停掉spark streaming查看日志,发现会有一个警告,告诉我sparkContext 上下文已经关闭,没办法写数据。



学习连接 http://www.linkedin.com/pulse/how-shutdown-spark-streaming-job-gracefully-lan-jiang

感谢各位大神提供的方案,我在这里个了详细的说明。

Unidbg逆向阿里系App签名:从环境补全到算法还原实战 在移动安全与协议分析领域,理解应用层签名机制是核心挑战之一。签名算法作为保障通信安全与身份验证的关键技术,其原理通常涉及哈希、加密及密钥协商等基础密码学概念。在Android平台,核心签名逻辑常被加固并隐藏于Native层SO库中,以对抗动态调试与静态分析,这为安全研究和协议兼容带来了技术障碍。Unidbg作为一种基于模拟执行的逆向工程工具,通过模拟ARM指令集和系统调用,允许研究者在脱离真机环境的情况下,可控地执行和调试SO文件,为解决此类问题提供了创新思路。其技术价值在于实现了对加固代码的确定性分析与算 阅读详情

相关推荐

推荐系统(1):推荐系统评测

对于可以离线优化的指标,我个人的看法是应该在给定覆盖率、多样性、新颖性等限制条件下,尽量优化预测准确度。用一个数学公式表达,离线实验的优化目标是:最大化预测准确度使得 覆盖率 > A多样性 > B新颖性 > C其中,A、B、C的取值应该视不同的应用而定。

数据不会骗人 2527

如何优雅的停止Spark streaming服务【一篇就够】

参看网上查阅的一些资料,结合自己实践,整理如下: 方法一、程序中设置一个开关来停止服务(推荐) 当检查到HDFS中存在"/user/root/stop_sparkStreaming"目录时,则优雅地停止服务 package com.sjmz.sparkdemo import org.apache.hadoop.conf.Configuration import org.apache.ha...

sjmz30071360的专栏 2906

Python手记-9:Python LXML库XPath的爬取晋江书目

1. lxml库 lxml是功能最丰富且易于使用的库,用于处理Python语言中的XML和HTML,还可实现WEB爬取,官文参考:https://lxml.de/,完整的PDF文档下载链接https://lxml.de/lxmldoc-4.5.0.pdf,但是阅读起来……em……怪自己不够聪明的样子。 Linux下安装lxml库:[root@chengyu ~]# pip3 instal...

成屿的专栏 4万+

spark 终止 运行_如何优雅地终止正在运行的Spark Streaming程序

一直运行的Streaming程序如何关闭呢?是直接使用kill命令强制关闭吗?这种手段是可以达到关闭的目的,但是带来的后果就是可能会导致数据的丢失,因为这时候如果程序正在处理接收到的数据,但是由于接收到kill命令,那它只能停止整个程序,而那些正在处理或者还没有处理的数据可能就会被丢失。那我们咋办?这里有两种方法。文章目录等作业运行完再关闭我们都知道,Streaming每隔batchDuratio...

weixin_39562554的博客 1057

嘉立创EDA实战:4层板叠层设计避坑指南(附阻抗计算技巧)

本文详细解析了嘉立创EDA在4层PCB叠层设计中的实战技巧与避坑指南,涵盖经典叠层方案对比、介质厚度选择、电源系统设计及高速信号完整性优化。特别介绍了阻抗计算工具的应用,帮助工程师在高速电路设计中实现性能与成本的最佳平衡。

sea99的博客 966

CANoe/CANalyzer新手必看:从零配置到报文分析的完整流程(附B站官方教程实操)

本文为CANoe/CANalyzer新手提供从零配置到报文分析的完整流程指南,涵盖硬件连接、工程配置、报文捕获及信号级分析等关键步骤。通过详细的实操案例和B站官方教程,帮助工程师快速掌握汽车电子总线分析工具的核心应用,提升诊断效率与通信系统理解。

y7z8a的博客 772

SparkStreaming如何优雅停止

Spark发展至今,对于流处理有着自己的优势,本篇博文给大家介绍一下,Spark流处理的优雅停止,作用在让计算自己停止,而非人为的暴力干预 给大家写了一个流处理做字频统计,结果写入mysql,做优雅停止的实例,希望可以帮到大家,大家看代码的时候要注意一个事项,我担心大家看不懂,写代码的时候把代码写的比较宽泛,大家看懂之后,自己写的时候可以精简一下 object StreamGranceStop2 { def main(args: Array[String]): Unit = { //下面的计算主体

别人笑我太疯癫,我笑他人看不穿。 500

S32K314 EB配置MCAL全模块讲解【Autosar——1 MCU模块详解】持续更新中

FIRC(fast internal RC Oscillator) :高速内部时钟,固定48MHZ;SIRC(Slow Internal RC Oscillator):低速内部时钟,固定32KHZ;FXOSC(Fast Crystal Oscillator Digital Controller):高速外部晶振(8-40MHZ),根据原理图选型进行配置;SXOSC():外部低速外部时钟,固定输入32.768KHZ;PLL_PHIn_CLK:时钟倍频锁相环时钟范围(640-1280MHZ);

qq_40488886的博客 1781

spark-sql-kafka streaming 首个batch日志太多导致异常退出

最近遇到了spark structured streaming从kafka读取数据时,首个批处理查询读取的日志太多导致程序崩溃,查找资料未果,只能从连接kafka的jar包源码入手,查看是否可以限制单个批量读取的最大日志数,最终通过修改源码重新编译实现该功能。 spark-sql-kafka在实现流式处理数据的时候,每次先读取前一个batch的topic-partition-offset,然后通...

sunrising_hill的专栏 1031

BQ40Z50R2循环学习实战:量产文件生成与关键状态位解析

本文详细解析了TI BQ40Z50R2电量计循环学习(Golden Learning)的实战流程与量产文件生成方法。重点剖析了updateStatus状态位在充放电静置阶段的常见异常(如卡在0x04或跳至0x0E)及其根本原因,并提供了从环境控制、命令顺序到文件处理的完整避坑指南,帮助工程师高效完成量产配置。

weixin_29170327的博客 214

基于LightGBM和多模型融合的量化交易研究:沪深300为例【附代码】

📊 数据科学与大数据专业 | 数据分析与模型构建 | 数据驱动决策✨ 专业领域:数据挖掘与清洗大数据处理与存储技术机器学习与深度学习模型数据可视化与报告生成分布式计算与云计算数据安全与隐私保护💡 擅长工具:Python/R/Matlab 数据分析与建模Hadoop/Spark 大数据处理平台SQL数据库管理与优化Tableau/Power BI 数据可视化工具TensorFlow/PyTorch 深度学习框架✅数据科学与大数据技术毕业论文【数据】

lagougongzuoshi的博客 1670

spark streaming 如何自动停止

问题 众所周知spark streaming是7*24小时实时运行的程序。但是如果业务场景就是某天的某个时间段需要使用呢?时间点时长不固定。这个时候就需要我们代码逻辑上启动与停止spark streaming程序了。 1.启动 对于spark(streaming)程序,我们通常是用shell脚本进行启动,而脚本的调用通常是由crontab或者调度系统例如azkaban定时启动,当然azkaba...

Luis的博客 1543

在 MATLAB/Simulink 中构建一个固定地面站天线指向控制系统的完整仿真模型

在卫星通信系统中,地面站天线负责与在轨卫星建立高增益、高稳定性的通信链路。对于固定地面站(如卫星测控站、深空站、VSAT主站),天线必须具备高精度指向能力,以确保波束始终对准卫星。然而,卫星(尤其是低轨卫星)在天空中快速移动,地面站天线必须实时跟踪其轨迹。此外,环境扰动(风载、热变形、机械误差)也会导致指向偏差。因此,设计一个高精度、高鲁棒性的天线指向控制系统(Antenna Pointing Control System)至关重要。本文将手把手教你如何在中构建一个固定地面站天线指向控制系统。

amy_mhd的博客 133

SparkStreaming如何优雅的停止服务

我们都知道SparkStreaming程序是一个长服务,一旦运转起来不会轻易停掉,那么如果我们想要停掉正在运行的程序应该怎么做呢? 如果运行的是spark on yarn模式直接使用 yarn application -kill taskId 暴力停掉sparkstreaming是有可能出现问题的,比如你的数据源是kafka,已经加载了一批数据到sparkstreaming中正在处

三劫散仙 8172

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SparkStreaming程序的监控脚本

SparkStreaming程序监控脚本,程序停止时会发邮件,同时也会重新启动改程序,但是l inux服务器必须具有发邮件的功能 #!/bin/bash is_adx_show=$(yarn application -list| awk '{print $2}' | grep 程序名称 | wc -l) if [ $is_adx_show = 0 ];then ...

鸿爸爸 981

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

sparkstreaming的日志收集

sparkstreaming日志只有在停止任务的时候才可以收集,因此可以实时传送到kafka当中 https://qindongliang.iteye.com/blog/2354381 日志聚合服务的配置项https://www.cnblogs.com/gnivor/p/4672746.html 粗略配置https://www.cnblogs.com/30go/p/8509893.html ...

yrsg666的博客 726

通过crontab监控SparkStreaming任务运行状态

1.问题 最近发现SparkStreaming提交的job经常在半夜挂掉,于是写了个定时任务监控SparkStreaming的运行状态,保证其不挂掉 2.shell脚本 touch /opt/module/jobs/monitorlog.txt vim /opt/module/jobs/monitor.sh #!/bin/bash #在linux中查找你所运行的spark任务中 任务名称为W...

wn147258369的博客 69

如何优雅的停止掉SparkStreaming

关于如何优雅的停止SparkStreaming,网上挺多的,我测试了一种简单的方法,分享出来 一个简简单单的SparkStreaming样例,从一个文件中读取数据后将结果保存到指定的目录中 package SparkStream import org.apache.spark.SparkConf import org.apache.spark.streaming.{Seconds, Str...

zhaoxiangchong的专栏 1579

SparkStreaming之优雅停止

1.监听redis的某个key是否存在 /** * 优雅的停止Streaming程序 * * @param ssc */ def stopByMarkKey(ssc: StreamingContext): Unit = { val intervalMills = 10 * 1000 // 每隔10秒扫描一次消息是否存在 var isStop = false ...

tianyeshiye 613

如何优雅的停止sparkstreaming程序

直接kill -9?不好吧,万一我这个程序还在处理数据呢?还没处理完呢?在处理的数据丢失了呢?但是我又想让它先停一下呢? 好了,直接上代码吧(语言组织不好)~ import org.apache.hadoop.conf.Configuration import org.apache.hadoop.fs.{FileSystem, Path} import org.apache.spark.strea...

没有合适的昵称 1685

优雅的停止SparkStreaming

背景:流式任务需要7*24小时执行,但是有时涉及到升级代码需要主动停止程序,但是分布式程序,没办法做到一个个进程去杀死,所有配置优雅的关闭就显得至关重要了。可以考虑使用外部文件存储或者关系型数据库、缓存等来控制内部程序关闭。 此例子使用hdfs创建指定文件来控制程序的关闭,想要更好的在前端进行控制,可以在注册程序中修改标志源。 import org.apache.hadoop.conf.Configuration import org.apache.hadoop.fs.{FileSystem, Pat

zhangxiaohui4445的博客 533

SparkStreaming

大数据第39天-SparkStreaming 一、SparkStreaming简介 ​ SparkStreaming是流式处理框架,是Spark API的扩展,支持可扩展、高吞吐量、容错的实时数据流处理,实时数据的来源可以是:Kafka, Flume, Twitter, ZeroMQ或者TCP sockets,并且可以使用高级功能的复杂算子来处理流数据。例如:map,reduce,join,win...

修行的博客 478

一文告诉你SparkStreaming如何整合Kafka!

        关于SparkStreaming从理论到实战的部分,博主已经在前面的博客中介绍了。本篇博客,为大家带来的是SparkStreaming整合Kafka的教程! 文章目录Kafka回顾整合kafka两种模式说明1.Receiver接收方式:2.Direct直连方式spark-streaming-kafka-0-8(了解)1.Receiver2.Directspark-streaming-kafka-0-10结语

大数据梦想家 1万+
上一篇: Stack trace: ExitCodeException exitCode=15 OR File does not exist: hdfs:/spark2-history
下一篇: MAC通过ZOC远程访问Linux
守猫de人
博客等级 码龄10年 29粉丝 46原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值