如何优雅地停止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 ...
随机推荐
- IE11,用Forms身份验证保存不了Cookie
在web.config中添加如下信息,即可. <authentication mode="Forms"> <forms cookieless=" ...
- HbaseShell启动
找到hbase目录 进入bin目录 ./hbase shell 成功
- Java实现命令行中的进度条功能
前言 最近在写一个命令行中的下载工具,既然是下载文件用的,那么实时显示下载进度是非常有必要的.因此,就有了这里对进度条的实现尝试. 预览图 还是先预览下效果图吧. 这里是cmd里面的效果,总体看着还行 ...
- centos python3 的 卸载 删除
卸载/删除python 3.4看到网上说慎用 apt-get remove和 yum remove ,因此不敢用此类命令用卸载了(以后阿里云服务器快过期不用了的时候可以试一下,看看系统是否会崩,哈哈) ...
- 201871010135 张玉晶 《面向对象程序设计(java)》 第一周学习总结
项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/wyt0455820/ ...
- Docker安装MySQL 8.0并挂载数据及配置文件
安装部署环境 Ubuntu 18.04.3 LTS Docker 19.03.2 MySQL latest(8.0.17) 下载镜像 # docker从仓库中拉取最新版的mysql镜像,如果没加标签的 ...
- Noip2016Day2T3 愤怒的小鸟
题目链接 problem 平面内有n个点,每次可以确定一条过原点且开口向上的抛物线,将这条抛物线上所有的点都删去.问最少需要删几次可以删掉全部的点. solution n比较小,直接状压一下.因为已经 ...
- 1+x 证书 Web 前端开发中级理论考试(试卷 7 ) 答案
1+x 证书 Web 前端开发中级理论考试(试卷 7 ) 答案 转载请注明来源:妙笔生花个人博客http://blog.zh66.club/index.php/archives/438/ 官方QQ群 ...
- #3144. 「APIO 2019」奇怪装置
#3144. 「APIO 2019」奇怪装置 题目描述 考古学家发现古代文明留下了一种奇怪的装置.该装置包含两个屏幕,分别显示两个整数 \(x\) 和 \(y\). 经过研究,科学家对该装置得出了一个 ...
- css的伪元素 ::after ::before 和 图标字体的使用
浅谈css的伪元素::after和::before css中的::after和::before已经被大量地使用在我们日常开发中了,使用他们可以使我们的文档结构更加简洁.但是很多人对::after和 ...