重温这一点,因为我没能使用现有的答案没有调试的几件事情。
我的目标是以编程方式终止一天持续运行一次的驱动程序,将任何更新部署到代码中,然后重新启动它。所以我不会提前知道我的驱动程序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()
[这里的一个溶液(https://stackoverflow.com/a/45947979/5513168)使用火花REST API用于火花独立簇。 –