如何优雅地停止Spark Streaming Job
由于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的更多相关文章
- Spark 学习笔记之 优雅地关闭Spark Streaming
优雅地关闭Spark Streaming: 当touch stop文件后,程序仍然会再执行一次,执行完成后退出.
- Spark Streaming中空RDD处理及流处理程序优雅的停止
本期内容 : Spark Streaming中的空RDD处理 Spark Streaming程序的停止 由于Spark Streaming的每个BatchDuration都会不断的产生RDD,空RDD ...
- Spark Streaming官方文档学习--下
Accumulators and Broadcast Variables 这些不能从checkpoint重新恢复 如果想启动检查点的时候使用这两个变量,就需要创建这写变量的懒惰的singleton实例 ...
- 4. Spark Streaming解析
4.1 初始化StreamingContext import org.apache.spark._ import org.apache.spark.streaming._ val conf = new ...
- 周期性清除Spark Streaming流状态的方法
在Spark Streaming程序中,若需要使用有状态的流来统计一些累积性的指标,比如各个商品的PV.简单的代码描述如下,使用mapWithState()算子: val productPvStrea ...
- Storm介绍及与Spark Streaming对比
Storm介绍 Storm是由Twitter开源的分布式.高容错的实时处理系统,它的出现令持续不断的流计算变得容易,弥补了Hadoop批处理所不能满足的实时要求.Storm常用于在实时分析.在线机器学 ...
- Spark Streaming消费Kafka Direct方式数据零丢失实现
使用场景 Spark Streaming实时消费kafka数据的时候,程序停止或者Kafka节点挂掉会导致数据丢失,Spark Streaming也没有设置CheckPoint(据说比较鸡肋,虽然可以 ...
- Spark Streaming
Spark Streaming Spark Streaming 是Spark为了用户实现流式计算的模型. 数据源包括Kafka,Flume,HDFS等. DStream 离散化流(discretize ...
- Spark Streaming官方文档学习--上
官方文档地址:http://spark.apache.org/docs/latest/streaming-programming-guide.html Spark Streaming是spark ap ...
随机推荐
- git命令教程
git教程笔记 Git是什么? Git是一个分布式版本控制系统 版本控制方式 集中式版本控制:从版本库中先取得最新的版本,改完之后再上传到版本库中,需要联网 分布式版本控制:每个合作者电脑上都有一个版 ...
- 纯css实现checkbox样式改变
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...
- Mybatis的逆向工程,自动生成代码(Mapper,xml,bean)
步骤: 1. 新建一个Maven项目: 然后导入maven依赖: <dependencies> <dependency> <groupId>org.mybatis& ...
- SQL server利用脚本添加链接服务器,可设置别名
USE [master]GO EXEC master.dbo.sp_addlinkedserver @server = N'你的别名', @srvproduct=N'', @provider=N'SQ ...
- HTML5中像网页中保存cookie的实现
if(window.plus)//判断当前的设备是手机 window.localStorage.setItem("key","value");//设置值 win ...
- 关于一道fork生成子进程的题目
题目如下: pid_t pid1,pid2; pid1=fork(); pid2=fork(); ||pid2<) { printf("Fork Failed\n"); } ...
- postman---Postman配置环境变量和全局变量
我们在测试的过程中,遇到最多的问题也可以是环境的问题了吧,今天开发用了这个测试环境,明天又换了另一个测试环境,这样对于我们测试非常的麻烦,特别最接口的时候需要来回的输入环境地址比较麻烦,今天我们看看强 ...
- JVM 类的加载机制
在对类的实例化之前.JVM 一般会先进行初始化 主要经过如下几个阶段: 1.加载 类加载的第一阶段,类加载时机有两个: 1.预加载:当虚拟机启动时,会预加载 ...
- shell基础、变量、相关脚本
目录 一.shell基础 书写规范 引号 配置文件 read交互 脚本调式 小节总结 二.变量 变量类型 位置变量 状态变量 替换和删除 变量补充 变量运算 小节总结 三.相关脚本面试题 统计hist ...
- 关于jvm的常识介绍
1.关于jvm的组成(只介绍1.8,以前的版本不多介绍) vm stack,native method stack,program counter register,heap,metaspace 2. ...