स्पार्क के कार्यों को मारने का कोई तरीका नहीं है यदि यह बहुत लंबा समय लेता है।
लेकिन मैं speculation का उपयोग कर इस संभाल करने के लिए एक तरीका खोज निकाला,
इसका मतलब यह है कि अगर एक या अधिक कार्य एक चरण में धीरे-धीरे चल रहे हैं, वे फिर से शुरू किया जाएगा।
spark.speculation true
spark.speculation.multiplier 2
spark.speculation.quantile 0
नोट: spark.speculation.quantile
"अटकलें" आपका पहला काम से में शुरू होगा का मतलब है। तो सावधानी के साथ इसका इस्तेमाल करें। मैं इसका उपयोग कर रहा हूं क्योंकि समय के साथ जीसी के कारण कुछ नौकरियां धीमी हो जाती हैं। तो मुझे लगता है कि आपको यह जानना चाहिए कि इसका उपयोग कब किया जाए - यह चांदी की बुलेट नहीं है।
कुछ प्रासंगिक लिंक: http://apache-spark-user-list.1001560.n3.nabble.com/Does-Spark-always-wait-for-stragglers-to-finish-running-td14298.html और http://mail-archives.us.apache.org/mod_mbox/spark-user/201506.mbox/%[email protected].com%3E
अद्यतन
मैं अपने जारी करने के लिए एक फ़िक्स (सभी के लिए काम नहीं हो सकता है) मिल गया। मेरे पास प्रति कार्य चलने वाले सिमुलेशन का एक गुच्छा था, इसलिए मैंने दौड़ के चारों ओर टाइमआउट जोड़ा। यदि सिमुलेशन अधिक समय ले रहा है (उस विशिष्ट रन के लिए डेटा स्काई के कारण), यह टाइमआउट होगा।
ExecutorService executor = Executors.newCachedThreadPool();
Callable<SimResult> task =() -> simulator.run();
Future<SimResult> future = executor.submit(task);
try {
result = future.get(1, TimeUnit.MINUTES);
} catch (TimeoutException ex) {
future.cancel(true);
SPARKLOG.info("Task timed out");
}
आप की तरह simulator
के मुख्य पाश अंदर व्यवधान संभाल सुनिश्चित करें:
if(Thread.currentThread().isInterrupted()){
throw new InterruptedException();
}
हो सकता है कि यह समझने में कुछ समय लगे कि यह क्यों हो रहा है और देखें कि क्या आप इससे बच सकते हैं। अधिकांश बार, ऐसा इसलिए होता है क्योंकि विभाजन कुंजी के समान समान रूप से संतुलित नहीं होता है जिसके परिणामस्वरूप कुछ कुंजियों और कुछ अन्य मूल्यों के साथ कुछ कुंजियां होती हैं। – hveiga