2015-05-07 112 views
12

我在独立模式下运行Spark群集。停止运行Spark应用程序

我已经提交使用选项群集模式火花应用:

--deploy-mode cluster –supervise 

因此该作业是容错。

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

事情我已经尝试:

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

所以运行的应用程序是真正的容错:)

问: 基于以上情况可以有人建议我怎么能停止运行或什么别的我可以尝试的工作,以阻止该应用程序运行但保持群集运行。

刚刚积累了一些东西,如果我调用sparkContext.stop()应该这样做,但这需要代码中的一些工作,但是您可以在没有代码更改的情况下使用其他任何方式。

+0

[这里的一个溶液(https://stackoverflow.com/a/45947979/5513168)使用火花REST API用于火花独立簇。 –

回答

13

如果你想杀死反复失败的应用程序,你可以通过这样做:

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

你可以找到通过在http独立主Web UI驾驶员ID://:8080。

Spark Doc

+0

工程就像一个魅力!谢谢 – jakstack

+0

你碰巧知道是否有办法阻止它与驱动程序ID? id每次都会改变。我想要一个运行spark-submit的jenkins作业,但是在提交新的作业之前先杀掉以前的过程。 – nickn

+1

什么是主网址?端口是什么样的?使用mesos运行它不会识别 - 主mesos:// ...像其他命令一样。火花提交似乎已经杀死。 –

2

重温这一点,因为我没能使用现有的答案没有调试的几件事情。

我的目标是以编程方式终止一天持续运行一次的驱动程序,将任何更新部署到代码中,然后重新启动它。所以我不会提前知道我的驱动程序ID是什么。我花了一些时间才发现,如果您提交了驱动程序--deploy-mode cluster选项,您只能杀死驱动程序。我花了一段时间才意识到应用程序ID和驱动程序ID之间存在差异,虽然您可以轻松地将应用程序名称与应用程序ID关联起来,但我还没有找到一种方法来通过它们的api端点来识别驱动程序ID并将其与应用程序名称或正在运行的类相关联。因此,尽管run-class org.apache.spark.deploy.Client kill <master url> <driver ID>有效,但您需要确保以集群模式部署驱动程序,并使用驱动程序ID而不是应用程序ID。

此外,还有一个提交终点,默认火花在http://<spark master>:6066/v1/submissions处提供,您可以使用http://<spark master>:6066/v1/submissions/kill/<driver ID>来终止您的驱动程序。

由于我无法从任何api端点找到与特定作业相关的驱动程序ID,我写了一个python web scraper从基本火花大师网页的端口8080处获取信息,然后使用它端口6066处的端点。我希望以受支持的方式获取这些数据,但这是我能找到的最佳解决方案。

#!/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()