2015-05-07 10 views
12

मैं स्टैंडअलोन मोड में स्पार्क क्लस्टर चला रहा हूं।रनिंग स्पार्क एप्लिकेशन को रोकना

मैं विकल्पों का उपयोग क्लस्टर मोड में एक स्पार्क आवेदन प्रस्तुत किया है:

--deploy-mode cluster –supervise 

ताकि नौकरी दोष सहिष्णु है।

अब मुझे क्लस्टर चलाना जारी रखना है, लेकिन एप्लिकेशन को चलने से रोकना है।

बातें मैं कोशिश की है:

  • क्लस्टर रोकना और यह पुन: प्रारंभ। लेकिन जब मैं ऐसा करता हूं तो एप्लिकेशन निष्पादन को फिर से शुरू करता है।
  • DriverWrapper नामक एक डिमन का उपयोग किया गया किल -9 लेकिन उसके बाद नौकरी फिर से शुरू हो जाती है।
  • मैंने अस्थायी फ़ाइलों और निर्देशिकाओं को भी हटा दिया है और क्लस्टर को पुनरारंभ किया है लेकिन नौकरी फिर से शुरू होती है।

तो चल आवेदन वास्तव में सहिष्णु गलती है :)

प्रश्न: उपरोक्त परिदृश्य के आधार पर किसी को सुझाव है कि कैसे मैं चल रहे हैं या और क्या मैं कोशिश कर सकते हैं से काम करना बंद कर सकते से आवेदन को रोकने के लिए कर सकते हैं चल रहा है लेकिन क्लस्टर चल रहा है।

कुछ मुझे सिर्फ अर्जित किया गया है, अगर मैं sparkContext.stop() को कॉल करता हूं जो इसे करना चाहिए, लेकिन इसके लिए कोड में थोड़ा सा काम की आवश्यकता है, लेकिन क्या आप कोड परिवर्तन के बिना किसी अन्य तरीके का सुझाव दे सकते हैं।

+0

[यहाँ एक समाधान है] (https://stackoverflow.com/a/45947979/5513168) स्पार्क स्टैंडअलोन समूहों के लिए स्पार्क बाकी एपीआई का उपयोग कर। –

उत्तर

13

आप एक आवेदन है कि बार-बार विफल हो रहा है को मारने के लिए चाहते हैं, आप के माध्यम से ऐसा कर सकते हैं:

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

आप http स्टैंडअलोन मास्टर वेब UI के माध्यम से चालक आईडी देख सकते हैं: //: 8080।

से Spark Doc

+0

एक आकर्षण की तरह काम करता है! धन्यवाद – jakstack

+0

क्या आपको पता है कि ड्राइवर आईडी के साथ इसे रोकने का कोई तरीका है या नहीं? आईडी हर बार बदलती है। मैं एक जेनकींस नौकरी चाहता हूं जो स्पार्क-सबमिट करता है लेकिन नई सबमिट करने से पहले पिछली प्रक्रिया को मारने के लिए। – nickn

+1

मास्टर यूआरएल क्या हैं? बंदरगाहों की तरह क्या दिखता है? मेसो के साथ चल रहा है यह पहचान नहीं है --मास्टर मेसोस: // ... अन्य आदेशों की तरह। स्पार्क-सबमिट में मारना प्रतीत होता है। –

2

इस रिविजिटिंग क्योंकि मैं कुछ चीजें डिबगिंग के बिना मौजूदा जवाब उपयोग करने के लिए सक्षम नहीं था।

मेरा लक्ष्य प्रोग्राम में एक ड्राइवर को मारना था जो दिन में लगातार एक बार चलता है, कोड के किसी भी अपडेट को तैनात करता है, फिर इसे पुनरारंभ करें। तो मैं समय से पहले नहीं जानता कि मेरी चालक आईडी क्या है। मुझे यह पता लगाने में कुछ समय लगा कि आप केवल ड्राइवरों को मार सकते हैं यदि आपने अपने ड्राइवर को --deploy-mode cluster विकल्प के साथ सबमिट किया है। मुझे यह महसूस करने में कुछ समय लगा कि एप्लिकेशन आईडी और ड्राइवर आईडी के बीच कोई अंतर था, और जब आप एप्लिकेशन आईडी के साथ एप्लिकेशन नाम को आसानी से सहसंबंधित कर सकते हैं, तब भी मुझे अपने एपीआई एंडपॉइंट्स के माध्यम से ड्राइवर आईडी को दिव्य करने का कोई तरीका नहीं मिला है और उस एप्लिकेशन के नाम या उस वर्ग से संबंधित है जो आप चल रहे हैं। इसलिए run-class org.apache.spark.deploy.Client kill <master url> <driver ID> काम करता है, आपको यह सुनिश्चित करना होगा कि आप क्लस्टर मोड में अपने ड्राइवर को तैनात कर रहे हैं और ड्राइवर आईडी का उपयोग कर रहे हैं, न कि एप्लिकेशन आईडी।

इसके अतिरिक्त, एक सबमिशन एंडपॉइंट है जो स्पार्क डिफ़ॉल्ट रूप से http://<spark master>:6066/v1/submissions पर प्रदान करता है और आप अपने ड्राइवर को मारने के लिए http://<spark master>:6066/v1/submissions/kill/<driver ID> का उपयोग कर सकते हैं।

चूंकि मैं किसी भी एपीआई एंडपॉइंट से किसी विशिष्ट नौकरी से संबंधित ड्राइवर आईडी नहीं ढूंढ पा रहा था, इसलिए मैंने पोर्ट 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() 
संबंधित मुद्दे