首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在纱线中启动/停止火花流作业的正确方法是什么?

在纱线中启动/停止火花流作业的正确方法是什么?
EN

Stack Overflow用户
提问于 2015-07-28 18:25:59
回答 3查看 13.6K关注 0票数 16

我已经做了很多个小时的实验和谷歌搜索,没有运气。

我有一个火花流应用程序运行良好,在本地星火集群。现在我需要在cloudera 5.4.4上部署它。我需要能够启动它,让它在后台持续运行,并能够阻止它。

我试过这个:

代码语言:javascript
运行
复制
$ spark-submit --master yarn-cluster --class MyMain my.jar myArgs

但它只是无止境地打印这些线条。

代码语言:javascript
运行
复制
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:因为它是一个流应用程序,所以它需要连续运行。那么,如何在“后台”模式下运行它呢?我所能找到的关于提交纱线上的火花作业的所有示例似乎都假设应用程序将完成一些工作并终止,因此您希望在前台运行它。但流媒体的情况并非如此。

下一个..。在这一点上,应用程序似乎没有发挥作用。我想这可能是我的错误或错误配置,所以我试着查看日志,看看发生了什么:

代码语言:javascript
运行
复制
$ yarn logs -applicationId application_1438092860895_012

但它告诉我:

代码语言:javascript
运行
复制
/tmp/logs/hdfs/logs/application_1438092860895_0012does not have any log files.

所以问题2:如果应用程序正在运行,为什么它没有日志文件?

所以最终我不得不杀了它

代码语言:javascript
运行
复制
$ yarn application -kill application_1438092860895_012

这就引出了问题3:假设我最终可以在后台启动和运行该应用程序,那么“纱线应用程序-kill”是阻止它的首选方法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-29 08:38:50

  1. 您可以关闭spark-submit控制台。当写入运行状态时,作业已经在后台运行。
  2. 应用程序完成之后,日志是可见的。在运行时,所有日志都可以在本地的工人节点上直接访问(您可以在纱线资源管理器web上看到),并在作业完成后聚合到HDFS
  3. yarn application -kill可能是阻止火花流应用程序的最好方法,但它并不完美。最好是做一些优雅的关闭,以停止所有流接收器和停止流上下文,但我个人不知道如何做。
票数 8
EN

Stack Overflow用户

发布于 2015-07-29 15:40:23

  1. 您的数据源是什么?如果它是可靠的,就像卡夫卡的直接接收器,纱线切断应该是罚款的。当应用程序重新启动时,它将从最后一个完整的批处理偏移量中读取。如果数据源不可靠,或者您想自己处理一个优雅的关闭,则必须在流上下文上实现某种外部挂钩。我也面临着同样的问题,最后我实现了一个小问题,在webui中添加一个新的选项卡,充当停止按钮。
票数 1
EN

Stack Overflow用户

发布于 2017-11-14 06:25:11

最后一个谜题元素是如何以优雅的方式阻止部署在纱线上的星火流应用程序。停止(或者更确切地说是杀死)纱线应用程序的标准方法是使用命令yarn application -kill [applicationId]。这个命令停止了Spark流应用程序,但是这可能发生在批处理的中间。因此,如果作业从Kafka读取数据,保存HDFS上的处理结果,并最终提交Kafka偏移量,那么当作业在提交偏移之前停止时,您应该期望HDFS上重复的数据。

第一次尝试解决优雅的关闭问题是调用关闭钩子中的停止方法。

代码语言:javascript
运行
复制
sys.addShutdownHook {
    streamingContext.stop(stopSparkContext = true, stopGracefully = true)
}

令人失望的是,关闭钩子被调用得太晚,无法完成已启动的批处理,而火花应用程序几乎立即被关闭。此外,JVM无法保证会调用关机钩子。

在撰写这篇博文时,唯一确认的方式是在纱线上优雅地关闭星火流应用程序,就是以某种方式通知应用程序计划关闭,然后以编程方式停止流上下文(但不是从停工钩子)。如果通知的应用程序在定义超时后没有停止,则只应将命令yarn application -kill作为最后手段使用。

可以使用HDFS上的标记文件(最简单的方法)或在驱动程序上公开的简单套接字/HTTP端点(复杂的方式)通知应用程序计划关闭。

由于我喜欢KISS原则,下面可以找到shell脚本伪代码,用于使用标记文件启动/停止星火流应用程序:

代码语言:javascript
运行
复制
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}
}

在星火流应用程序中,后台线程应该监视标记文件,当文件消失时,停止上下文调用

代码语言:javascript
运行
复制
streamingContext.stop(stopSparkContext = true, stopGracefully = true)

您还可以参考http://blog.parseconsulting.com/2017/02/how-to-shutdown-spark-streaming-job.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31684323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档