由于streaming流程序一旦运行起来,基本上是无休止的状态,除非是特殊情况,否则是不会停的。因为每时每刻都有可能在处理数据,如果要停止也需要确认当前正在处理的数据执行完毕,并且不能再接受新的数据,这样才能保证数据不丢不重。

  同时,也由于流程序比较特殊,所以也不能直接kill -9这种暴力方式停掉,直接kill的话,就有可能丢失数据或者重复消费数据。

  

  下面介绍如何优雅的停止streaming job。

  第一种:人工手动停止

  •   程序里设置如下参数:
sparkConf.set("spark.streaming.stopGracefullyOnShutdown","true")//优雅的关闭
  •   然后按照下面步骤操作

    • 通过Hadoop 8088页面找到运行的程序
    • 打开spark UI的监控页面
    • 打开executor的监控页面
    • 登录Linux找到驱动节点所在的机器IP以及运行的端口号
    • 然后执行一个封装好的命令
      sudo ss -tanlp |  grep 5555 |awk '{print $6}'|awk  -F, '{print $2}' | sudo  xargs kill -15

    这种方式显然是比较复杂的。

  第二种:使用HDFS系统做消息通知

    在驱动程序中,加上一段代码,作用就是每隔一段时间扫描HDFS上一个文件,如果发现这个文件存在,就调用StreamContext的Stop方法,优雅的停止程序。

    这里的HDFS可以换成reids、zk、hbase、db,唯一的问题就是依赖了外部的一个存储系统来达到消息通知的目的。

    使用这种方式,停止程序就比较简单。登录有HDFS客户端的机器,然后touch一个空文件到指定目录,等到间隔的扫描时间,发现有文件存在,就需要关闭程序了。

    废话不多说,上代码

    ssc.start()

    //check interval
val checkIntervalMillis = 15000
var isStopped = false println("before while")
while (!isStopped) {
println("calling awaitTerminationOrTimeout")
isStopped = ssc.awaitTerminationOrTimeout(checkIntervalMillis)
if (isStopped)
println("confirmed! The streaming context is stopped. Exiting application...")
else
println("Streaming App is still running.") println("check file exists")
if (!stopFlag) {
val fs = FileSystem.get(new URI("hdfs://192.168.156.111:9000"),new Configuration())
stopFlag = fs.exists(new Path("/stopMarker/marker"))
}
if (!isStopped && stopFlag) {
println("stopping ssc right now")
ssc.stop(true, true)
}
}

  第三种:内部暴露一个socket或者http端口用来接收请求,等待除法关闭流程序

    这种方式需要在driver启动一个socket线程,或者http服务。比较推荐使用http服务,因为socket有点偏底层,处理起来稍微复杂。

    如果使用http服务,可以直接用内嵌的jetty,对外暴露一个http接口。Spark UI页面用的也是内嵌的jetty提供服务,所以不需要在pom文件引入额外的依赖,在关闭的时候,找到驱动所在的IP,就可以直接通过crul或者浏览器直接关闭流程序

    找到驱动程序所在的IP,可以在程序启动的log中看到,也可以在spark master UI界面上找到,这种方式不依赖任何的存储系统,仅仅在部署的时候需要一个额外的端口号暴露http服务。

推荐使用第二种或第三种,如果想最大程度的减少对外部系统的依赖,推荐使用第三种。

参考文档:https://www.linkedin.com/pulse/how-shutdown-spark-streaming-job-gracefully-lan-jiang

如何优雅地停止Spark Streaming Job的更多相关文章

  1. Spark 学习笔记之 优雅地关闭Spark Streaming

    优雅地关闭Spark Streaming: 当touch stop文件后,程序仍然会再执行一次,执行完成后退出.

  2. Spark Streaming中空RDD处理及流处理程序优雅的停止

    本期内容 : Spark Streaming中的空RDD处理 Spark Streaming程序的停止 由于Spark Streaming的每个BatchDuration都会不断的产生RDD,空RDD ...

  3. Spark Streaming官方文档学习--下

    Accumulators and Broadcast Variables 这些不能从checkpoint重新恢复 如果想启动检查点的时候使用这两个变量,就需要创建这写变量的懒惰的singleton实例 ...

  4. 4. Spark Streaming解析

    4.1 初始化StreamingContext import org.apache.spark._ import org.apache.spark.streaming._ val conf = new ...

  5. 周期性清除Spark Streaming流状态的方法

    在Spark Streaming程序中,若需要使用有状态的流来统计一些累积性的指标,比如各个商品的PV.简单的代码描述如下,使用mapWithState()算子: val productPvStrea ...

  6. Storm介绍及与Spark Streaming对比

    Storm介绍 Storm是由Twitter开源的分布式.高容错的实时处理系统,它的出现令持续不断的流计算变得容易,弥补了Hadoop批处理所不能满足的实时要求.Storm常用于在实时分析.在线机器学 ...

  7. Spark Streaming消费Kafka Direct方式数据零丢失实现

    使用场景 Spark Streaming实时消费kafka数据的时候,程序停止或者Kafka节点挂掉会导致数据丢失,Spark Streaming也没有设置CheckPoint(据说比较鸡肋,虽然可以 ...

  8. Spark Streaming

    Spark Streaming Spark Streaming 是Spark为了用户实现流式计算的模型. 数据源包括Kafka,Flume,HDFS等. DStream 离散化流(discretize ...

  9. Spark Streaming官方文档学习--上

    官方文档地址:http://spark.apache.org/docs/latest/streaming-programming-guide.html Spark Streaming是spark ap ...

随机推荐

  1. textarea中文本高亮选中

    最近在实现原文/译文句段高亮对比显示,和有道翻译类似,如下图所示: 最初的解决方案是采用富文本编辑器,把所有句段信息都用HTML标签包裹,操作空间比较大,页面上需要的功能几乎都可以实现,但是由此带来了 ...

  2. JQuery Ztree 树插件配置与应用小结

    JQuery Ztree 树插件配置与应用小结 by:授客 QQ:1033553122 测试环境 Win7 jquery-3.2.1.min.js 下载地址: https://gitee.com/is ...

  3. Thymeleaf常用语法:模板片断

    系统中的很多页面有很多公共内容,例如菜单.页脚等,这些公共内容可以提取放在一个称为“模板片断”的公共页面里面,其它页面可以引用这个 “模板片断”内容. 一.模板片断的定义 可以是html标签,也可以使 ...

  4. 获取当前Linux的外网地址

    有时候我们在测试配置外网IP是不是成功时,我们需要使用一些命令,使用 ssh 登录可以查看ip, 还有一种可以使用命令: curl ifconfig.me 进行方便获取,公网IP:真的是非常好的服务: ...

  5. 初级模拟电路:3-9 BJT三极管实现逻辑门

    回到目录 BJT晶体管可以实现逻辑门,事实上,在场效应管被发明用于集成电路以前,各种逻辑门芯片中的电路就是用BJT晶体管来实现的.最早人们使用二极管与BJT组合来实现逻辑门,这个称为二极管-晶体管逻辑 ...

  6. eNSP仿真软件之VLAN基础配置及Access接口

    ★Access接口是交换机上用来连接用户主机的接口. 实验内容: 实验步骤: (1)      打开仿真软件eNSP,新建拓扑.根据实验内容建立如下实验拓扑图. (2)      按照如下的编址表对每 ...

  7. Gaussian field consensus论文解读及MATLAB实现

    Gaussian field consensus论文解读及MATLAB实现 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.Introduction ...

  8. python第一次作业-Numpy练习

    1.创建一个边界值为1而内部都是0的数组,图例如下:[提示:]解此题可以先把所有值都设置为1,这是大正方形:其次,把边界除外小正方形全部设置为0.本题用到numpy的切片原理.多维数组同样遵循x[st ...

  9. 记一个bootstrap定制container导致页面X轴出现横向滚动条的坑

     壹 ❀ 引 在bootstrap定制时,因为UI给的图纸的页面主体部分宽度为1200px,所以我将container容器宽度从默认的1170px改成了1200px,随后在页面缩小的调试过程中发现了页 ...

  10. 源码学习之Spring (系统架构简单解析)

    Spring Framework 系统架构总览图 Spring Framework的模块依赖关系图 Spring Framework各个模块功能说明 Spring核心模块 模块名称 主要功能 Spri ...