2015-05-07 22 views
12

Tôi đang chạy cụm Spark ở chế độ độc lập.Dừng ứng dụng Spark đang chạy

Tôi đã gửi một ứng dụng Spark trong chế độ cụm sử dụng tùy chọn:

--deploy-mode cluster –supervise 

Vì vậy mà công việc là lỗi khoan dung.

Bây giờ tôi cần phải giữ cho cụm chạy nhưng dừng chạy ứng dụng.

Những điều tôi đã cố gắng:

  • Dừng cụm và khởi động lại nó. Nhưng ứng dụng tiếp tục thực hiện khi tôi thực hiện điều đó.
  • Đã sử dụng Kill -9 của daemon có tên DriverWrapper nhưng công việc tiếp tục lại sau đó.
  • Tôi cũng đã xóa các tệp và thư mục tạm thời và khởi động lại cụm nhưng công việc tiếp tục lại.

Vì vậy, các ứng dụng đang chạy thực sự là lỗi tolerant :)

Câu hỏi: Dựa trên kịch bản trên ai đó có thể đề nghị làm thế nào tôi có thể ngăn chặn việc chạy hoặc những gì khác tôi có thể cố gắng để ngăn chặn các ứng dụng từ chạy nhưng giữ cho cụm chạy.

Điều gì đó chỉ tích luỹ với tôi, nếu tôi gọi sparkContext.stop() nên thực hiện nhưng nhưng yêu cầu một chút công việc trong mã là OK nhưng bạn có thể đề xuất bất kỳ cách nào khác mà không cần thay đổi mã.

+0

[Đây là giải pháp] (https://stackoverflow.com/a/45947979/5513168) bằng cách sử dụng API Spark REST cho các cụm độc lập Spark. –

Trả lời

13

Nếu bạn muốn giết một ứng dụng được thất bại nhiều lần, bạn có thể làm như vậy thông qua:

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

Bạn có thể tìm thấy ID lái xe qua Thầy giao diện web độc lập tại http: //: 8080.

Từ Spark Doc

+0

hoạt động như một sự quyến rũ! cảm ơn – jakstack

+0

Bạn có biết rằng có cách nào để ngăn chặn nó với id trình điều khiển không? Id thay đổi mỗi lần. Tôi muốn có một công việc jenkins chạy spark-submit nhưng để giết quá trình trước đó trước khi gửi một cái mới. – nickn

+1

Url chính là gì? Các cổng trông như thế nào? Chạy với mesos nó không nhận ra - admin mesos: // ... giống như các lệnh khác. spark-submit dường như đã giết chết. –

2

Xem xét lại điều này bởi vì tôi đã không thể sử dụng câu trả lời hiện tại mà không gỡ một vài điều.

Mục tiêu của tôi là xóa chương trình một trình điều khiển chạy liên tục mỗi ngày một lần, triển khai bất kỳ cập nhật nào cho mã, sau đó khởi động lại. Vì vậy, tôi sẽ không biết trước thời gian ID lái xe của tôi là gì. Nó đã cho tôi một thời gian để tìm ra rằng bạn chỉ có thể giết các trình điều khiển nếu bạn gửi trình điều khiển của bạn với các tùy chọn --deploy-mode cluster. Nó cũng đã cho tôi một thời gian để nhận ra rằng có một sự khác biệt giữa ID ứng dụng và ID trình điều khiển, và trong khi bạn có thể dễ dàng tương quan một tên ứng dụng với một ID ứng dụng, tôi vẫn chưa tìm cách để xác định ID trình điều khiển thông qua các điểm cuối api của chúng và tương quan với tên ứng dụng hoặc lớp bạn đang chạy. Vì vậy, trong khi run-class org.apache.spark.deploy.Client kill <master url> <driver ID> hoạt động, bạn cần đảm bảo rằng bạn đang triển khai trình điều khiển của mình ở chế độ cụm và đang sử dụng ID trình điều khiển chứ không phải ID ứng dụng.

Ngoài ra, có điểm cuối gửi mà tia lửa cung cấp theo mặc định tại http://<spark master>:6066/v1/submissions và bạn có thể sử dụng http://<spark master>:6066/v1/submissions/kill/<driver ID> để tiêu diệt trình điều khiển của mình.

Vì tôi không thể tìm thấy ID trình điều khiển có liên quan đến một công việc cụ thể từ bất kỳ điểm cuối api nào, tôi đã viết một trình thu thập web python để lấy thông tin từ trang web chính của spark tại cổng 8080 rồi giết nó bằng cách sử dụng điểm cuối tại cổng 6066.Tôi muốn nhận dữ liệu này theo cách được hỗ trợ, nhưng đây là giải pháp tốt nhất tôi có thể tìm thấy.

#!/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() 
Các vấn đề liên quan