当前位置: 首页 > 知识库问答 >
问题:

停止正在运行的Spark应用程序

赵修诚
2023-03-14

我正在以独立模式运行Spark群集。

我已使用以下选项提交了群集模式下的Spark应用程序:

--deploy-mode cluster –supervise 

使作业具有容错性。

现在我需要保持集群运行但停止应用程序运行。

我尝试过的事情:

  • 停止集群并重新启动它。但是当我这样做时,应用程序会恢复执行。
  • 使用了名为DriverWrapper的守护进程的Kill-9,但之后工作再次恢复。
  • 我还删除了临时文件和目录并重新启动了集群,但作业再次恢复。

所以正在运行的应用程序确实是容错的。

问题:基于上述场景,有人可以建议我如何停止作业运行,或者我可以尝试停止应用程序运行但保持集群运行的其他方法。

如果我调用sparkContext,我就会产生一些想法。stop()应该这样做,但这需要在代码中做一些工作,这是可以的,但您可以在不更改代码的情况下提出任何其他方法。

共有3个答案

鲜于华容
2023-03-14

https://community.cloudera.com/t5/Support-Questions/What-is-the-correct-way-to-start-stop-spark-streaming-jobs/td-p/30183

根据此链接,如果您的主人使用纱线,请停止

yarn application -list

yarn application -kill application_id
周玺
2023-03-14

重温这个,因为我无法在不调试一些东西的情况下使用现有的答案。

我的目标是以编程方式杀死一个每天持续运行一次的驱动程序,部署对代码的任何更新,然后重新启动它。所以我不会提前知道我的司机ID是什么。我花了一些时间才弄明白,只有使用部署模式集群选项提交驱动程序,才能杀死驱动程序。我还花了一些时间才意识到应用程序ID和驱动程序ID之间存在差异,虽然您可以轻松地将应用程序名称与应用程序ID关联起来,但我还没有找到一种方法通过它们的apiendpoint来判断驱动程序ID,并将其与应用程序名称或正在运行的类关联起来。所以,当运行class org时。阿帕奇。火花部署客户端终止

此外,spark在http上默认提供了一个提交endpoint://

由于我无法从任何apiendpoint找到与特定作业相关的驱动程序ID,因此我编写了一个python web scraper,从端口8080的基本spark母版网页获取信息,然后使用端口6066的endpoint终止它。我更愿意以支持的方式获取这些数据,但这是我能找到的最好的解决方案。

#!/usr/bin/python

import sys, re, requests, json
from selenium import webdriver

classes_to_kill = sys.argv
spark_master = 'masterurl'

driver = webdriver.PhantomJS()
driver.get("http://" + spark_master + ":8080/")

for running_driver in driver.find_elements_by_xpath("//*/div/h4[contains(text(), 'Running Drivers')]"):
    for driver_id in running_driver.find_elements_by_xpath("..//table/tbody/tr/td[contains(text(), 'driver-')]"):
        for class_to_kill in classes_to_kill:
            right_class = driver_id.find_elements_by_xpath("../td[text()='" + class_to_kill + "']")
            if len(right_class) > 0:
                driver_to_kill = re.search('^driver-\S+', driver_id.text).group(0)
                print "Killing " + driver_to_kill
                result = requests.post("http://" + spark_master + ":6066/v1/submissions/kill/" + driver_to_kill)
                print json.dumps(json.loads(result.text), indent=4)

driver.quit()
邹野
2023-03-14

如果希望终止重复失败的应用程序,可以通过以下方式执行:

./bin/spark-class org.apache.spark.deploy.Client kill <master url> <driver ID>

您可以通过http://:8080上的独立主web UI找到驱动程序ID。

来自Spark Doc

 类似资料:
  • 我有一个正在运行的Spark应用程序,它占据了所有核心,而我的其他应用程序将不会被分配任何资源。 我做了一些快速的研究,人们建议使用YARN kill或 /bin/spark-class来杀死命令。然而,我使用的是CDH版本, /bin/spark-class根本不存在,YARN kill应用程序也不起作用。 有人能和我一起吗?

  • 我正在创建一个BLE应用程序,需要连续启动和停止扫描预定义的时间间隔。我实现它的方式是使用两个Runnable,它们相互调用,如下所示: 我正在尝试开始连续扫描并在单击按钮时暂停。开始按钮可以启动过程,但我无法停止扫描。 如果在停止间隔期间按下停止按钮,扫描将停止。但是,如果在扫描可运行状态下按stop按钮,则会删除stopScan可运行状态下的回调,同时保持扫描可运行状态持续运行。我需要的是两个

  • 我的iOS应用程序在出现运行时错误后停止运行。我将错误捕获为异常。我希望应用程序在错误处理后继续运行到下一步。有人建议怎么做吗?

  • 上周,我完成了一个测试应用程序的开发,并在所有模拟器中成功运行了它。今天我决定考虑发布这个应用程序,并使用了“Sent Android Build”。生成状态“成功”。然后尝试从命令行运行jar,得到: 所以试图逃离GUI并得到: Java版本: 我在Suse Linux 42.1 64b上使用Netbeans(这是新的)。 我在什么地方丢了一个图书馆吗?还是别的什么?

  • 问题内容: 我正在尝试制作一个简单的计时器,该计时器在指定的秒数后发出提示音。我设法使其正常工作,但是TimerTask在蜂鸣声后继续运行。现在我停止执行吗?这是我的代码: 问题答案: 您需要通过调用以下方法来取消计时器 这将取消任务,因此可以执行以下操作:

  • 我有个问题希望你能帮我解决。 有时,我的应用程序会出现一些错误,并继续在服务器上运行,直到我手动停止服务器并重新启动。