前面的文章,已经简单提到过怎么样关闭流程序。因为Spark Streaming流程序比较特殊,所以不能直接执行kill -9 这种暴力方式停掉,如果使用这种方式停程序,那么就有可能丢失数据或者重复消费数据。
为什么呢?因为流程序一旦起来基本上是一个7*24小时的状态,除非特殊情况,否则是不会停的,因为每时每刻都有可能在处理数据,如果要停,也一定要确认当前正在处理的数据执行完毕,并且不能在接受新的数据,只有这样才能保证不丢不重。
如何优雅的关闭spark streaming呢?方式主要有三种:
第一种:全人工介入
首先程序里面设置下面的配置参数
sparkConf.set("spark.streaming.stopGracefullyOnShutdown","true")//优雅的关闭
然后按照下面的步骤依次操作:
(1)通过Hadoop 8088页面找到运行的程序
(2)打开spark ui的监控页面
(3)打开executor的监控页面
(4)登录liunx找到驱动节点所在的机器ip以及运行的端口号
(5)然后执行一个封装好的命令
sudo ss -tanlp | grep 5555 |awk '{print $6}'|awk -F, '{print $2}' | sudo xargs kill -15
从上面的步骤可以看出,这样停掉一个spark streaming程序是比较复杂的。那么有没有更加优雅的方式来停止它呢?答案是有的
第二种:使用HDFS系统做消息通知
在驱动程序中,加一段代码,这段代码的作用每隔一段时间可以是10秒也可以是3秒,扫描HDFS上某一个文件,如果发现这个文件存在,就调用StreamContext对象stop方法,自己优雅的终止自己,其实这里HDFS可以换成redis,zk,hbase,db都可以,这里唯一的问题就是依赖了外部的一个存储系统来达到消息通知的目的,如果使用了这种方式后。停止流程序就比较简单了,登录上有hdfs客户端的机器,然后touch一个空文件到指定目录,然后等到间隔的扫描时间到之后,发现有文件存在,就知道需要关闭程序了。
第三种:内部暴露一个socket或者http端口用来接收请求,等待触发关闭流程序
这种方式,需要在driver启动一个socket线程,或者http服务,这里推荐使用http服务,因为socket有点偏底层处理起来稍微复杂点,如果使用http服务,我们可以直接用内嵌的jetty,对外暴露一个http接口,spark ui页面用的也是内嵌的jetty提供服务,所以我不需要在pom里面引入额外的依赖,在关闭的时候,找到驱动所在ip,就可以直接通过curl或者浏览器就直接关闭流程序。
找到驱动程序所在的ip,可以在程序启动的log中看到,也可以在spark master ui的页面上找到。这种方式不依赖任何外部的存储系统,仅仅部署的时候需要一个额外的端口号用来暴露http服务。
至此,关于优雅的停止spark streaming的主流方式已经介绍完毕,推荐使用第二种或者第三种,如果想要最大程度减少对外部系统的依赖,推荐使用第三种方式。
关于具体第二种和第三种的样例代码,下篇文章会整理一下放在github中给大家参考。
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。
分享到:
相关推荐
一个完善的Spark Streaming二次封装开源框架,包含:实时流任务调度、...基于Spark Streaming的大数据实时流计算平台和框架(包括:调度平台,开发框架,开发demo),并且是基于运行在yarn模式运行的spark streaming
java的sparkstreaming连接kafka的例子,kafka生产者生产消息,消费者读取消息,sparkstreaming读取kafka小区并进行存储iotdb数据库。
sparkStreaming消费数据不丢失,sparkStreaming消费数据不丢失
spark Streaming和structed streaming分析,理解整个 Spark Streaming 的模块划分和代码逻辑。
8:提交程序到spark集群上运行 9:监测端口内容,每隔10秒钟输出一次,当有内容出现的时候,单词计数输出内容 10:退出监测,Ctrl+Z,但是这样并没有完全退出监测,到http://localhost:8080/里杀死该任务,也可以...
基于 Flume+ Kafka+ Spark Streaming 实现实时监控输出日志的报警系统的 Spark Streaming 程序代码。 基于 Flume+Kafka+Spark Streaming 实现实时监控输出日志的报警系统的 Spark Streaming 程序代码,博客链接: ...
(1)利用SparkStreaming从文件目录读入日志信息,日志内容包含: ”日志级别、函数名、日志内容“ 三个字段,字段之间以空格拆分。请看数据源的文件。 (2)对读入都日志信息流进行指定筛选出日志级别为error或warn...
Spark Streaming实时流处理项目实战.rar.rar
Spark中的(弹性分布式数据集)简称RDD: Spark中的Transformation操作之Value数据类型的算子: Spark中的Transformation操作之Key-Value数据类型的算子: Spark中的Action操作: Transformation->map算子: ...
spark streaming streaming
这个项目是用Java运行一个Spark Streaming应用程序 mvn clean compile assembly:assembly >> 使用 deps 构建 jar spark-submit --class ...
Flink,Storm,Spark Streaming三种流框架的对比分析。比较清晰明确
深入理解SparkStreaming执行模型,spark研究专家多年的成果总结,值得学习!
1.Spark Streaming整合Flume需要的安装包. 2. Spark Streaming拉取Flume数据的flume配置文件.conf 3. Flume向Spark Streaming推数据的flume配置文件.conf
Spark零基础思维导图(内含spark-core ,spark-streaming,spark-sql),总结的很全面。 Spark零基础思维导图(内含spark-core ,spark-streaming,spark-sql)。 Spark零基础思维导图(内含spark-core ,spark-streaming,...
写的非常好,早了好久才找到。SparkStreaming预研报告
spark Streaming的原理介绍和与storm的对比
spark之sparkStreaming 理解,总结了自己的理解,欢迎大家下载观看!
06Spark Streaming原理和实践