我已经做了很多个小时的实验和谷歌搜索,没有运气。
我有一个火花流应用程序运行良好,在本地星火集群。现在我需要在cloudera 5.4.4上部署它。我需要能够启动它,让它在后台持续运行,并能够阻止它。
我试过这个:
$ spark-submit --master yarn-cluster --class MyMain my.jar myArgs但它只是无止境地打印这些线条。
15/07/28 17:58:18 INFO Client: Application report for application_1438092860895_0012 (state: RUNNING)
15/07/28 17:58:19 INFO Client: Application report for application_1438092860895_0012 (state: RUNNING)问题1:因为它是一个流应用程序,所以它需要连续运行。那么,如何在“后台”模式下运行它呢?我所能找到的关于提交纱线上的火花作业的所有示例似乎都假设应用程序将完成一些工作并终止,因此您希望在前台运行它。但流媒体的情况并非如此。
下一个..。在这一点上,应用程序似乎没有发挥作用。我想这可能是我的错误或错误配置,所以我试着查看日志,看看发生了什么:
$ yarn logs -applicationId application_1438092860895_012但它告诉我:
/tmp/logs/hdfs/logs/application_1438092860895_0012does not have any log files.所以问题2:如果应用程序正在运行,为什么它没有日志文件?
所以最终我不得不杀了它
$ yarn application -kill application_1438092860895_012这就引出了问题3:假设我最终可以在后台启动和运行该应用程序,那么“纱线应用程序-kill”是阻止它的首选方法吗?
发布于 2015-07-29 08:38:50
spark-submit控制台。当写入运行状态时,作业已经在后台运行。yarn application -kill可能是阻止火花流应用程序的最好方法,但它并不完美。最好是做一些优雅的关闭,以停止所有流接收器和停止流上下文,但我个人不知道如何做。发布于 2015-07-29 15:40:23
发布于 2017-11-14 06:25:11
最后一个谜题元素是如何以优雅的方式阻止部署在纱线上的星火流应用程序。停止(或者更确切地说是杀死)纱线应用程序的标准方法是使用命令yarn application -kill [applicationId]。这个命令停止了Spark流应用程序,但是这可能发生在批处理的中间。因此,如果作业从Kafka读取数据,保存HDFS上的处理结果,并最终提交Kafka偏移量,那么当作业在提交偏移之前停止时,您应该期望HDFS上重复的数据。
第一次尝试解决优雅的关闭问题是调用关闭钩子中的停止方法。
sys.addShutdownHook {
streamingContext.stop(stopSparkContext = true, stopGracefully = true)
}令人失望的是,关闭钩子被调用得太晚,无法完成已启动的批处理,而火花应用程序几乎立即被关闭。此外,JVM无法保证会调用关机钩子。
在撰写这篇博文时,唯一确认的方式是在纱线上优雅地关闭星火流应用程序,就是以某种方式通知应用程序计划关闭,然后以编程方式停止流上下文(但不是从停工钩子)。如果通知的应用程序在定义超时后没有停止,则只应将命令yarn application -kill作为最后手段使用。
可以使用HDFS上的标记文件(最简单的方法)或在驱动程序上公开的简单套接字/HTTP端点(复杂的方式)通知应用程序计划关闭。
由于我喜欢KISS原则,下面可以找到shell脚本伪代码,用于使用标记文件启动/停止星火流应用程序:
start() {
hdfs dfs -touchz /path/to/marker/my_job_unique_name
spark-submit ...
}
stop() {
hdfs dfs -rm /path/to/marker/my_job_unique_name
force_kill=true
application_id=$(yarn application -list | grep -oe "application_[0-9]*_[0-9]*"`)
for i in `seq 1 10`; do
application_status=$(yarn application -status ${application_id} | grep "State : \(RUNNING\|ACCEPTED\)")
if [ -n "$application_status" ]; then
sleep 60s
else
force_kill=false
break
fi
done
$force_kill && yarn application -kill ${application_id}
}在星火流应用程序中,后台线程应该监视标记文件,当文件消失时,停止上下文调用
streamingContext.stop(stopSparkContext = true, stopGracefully = true)您还可以参考http://blog.parseconsulting.com/2017/02/how-to-shutdown-spark-streaming-job.html
https://stackoverflow.com/questions/31684323
复制相似问题