spark优雅关闭
sparkConf.set("spark.streaming.stopGracefullyOnShutdown", "true")
// 启动新的线程,希望在特殊的场合关闭SparkStreaming
new Thread(new Runnable {
override def run(): Unit = {
while ( true ) {
try {
Thread.sleep(5000)
} catch {
case ex : Exception => println(ex)
}
// 监控HDFS文件的变化
val fs: FileSystem = FileSystem.get(new URI("hdfs://hadoop202:9000"), new Configuration(), "atguigu")
val state: StreamingContextState = context.getState()
// 如果环境对象处于活动状态,可以进行关闭操作
if ( state == StreamingContextState.ACTIVE ) {
// 判断路径是否存在
val flg: Boolean = fs.exists(new Path("hdfs://hadoop202:9000/stopSpark2"))
if ( flg ) {
context.stop(true, true)
System.exit(0)
}
}
}
}
}).start()
大数据优雅停止程序步骤
(1)通过Hadoop 8088页面找到运行的程序
(2)打开spark ui的监控页面
(3)打开executor的监控页面
(4)登录liunx找到驱动节点所在的机器ip以及运行的端口号(比如端口为56194)
(5)然后执行一个封装好的命令
sudo ss -tanlp | grep 56194 |awk '{print $6}'|awk -F, '{print $2}'|awk -F= '{print $2}'|sudo xargs kill -15
最好现用一下命令核实一下情况:
sudo ss -tanlp | grep 56194 |awk '{print $6}'|awk -F, '{print $2}'|awk -F= '{print $2}'
kill命令介绍
1, kill -15 pid (kill -SIGTERM )(默认)
执行完该指令后,操作系统会发送一个 SIGTERM 信号给对应的程序。当程序接收到该信号后,可能会发生以下几种情况的一种:
1,当前程序立刻停止;
2,程序释放相应资源,然后再停止;
3,程序可能仍然继续运行。
大部分程序会先释放自己的资源,然后再停止。但是也有程序可以在接受到信号量后,继续做其他一些事情,并且这些事情是可以配置的。
如果程序正在等待IO,可能就不会立马做出响应。也就是说,(15) SIGTERM 是可能被阻塞、被忽略的。
2. kill -9 pid (kill -SIGKILL)
如果 (15) SIGTERM 可以不进行响应?
那(9) SIGKILL就是必杀信号,多半 ROOT 会直接使用这个命令,但并不推荐这么做
小结:
在使用 kill -9 前,应该先使用 kill -15,给目标进程一个清理善后工作的机会。如果没有,可能会留下一些不完整的文件或状态,从而影响服务的再次启动