2015-08-04 4 views
9

हम yarn-client के रूप में एक स्पार्क क्लस्टर का उपयोग कई व्यापार गणना करने के लिए, लेकिन कभी कभी हम एक काम बहुत लंबा समय समाप्त हो गया है:यार्न-क्लाइंट में बहुत लंबे समय तक चलने वाले कार्यों (नौकरी में दूसरों की तुलना) के साथ कैसे निपटें?

enter image description here

हम समाप्ति सेट नहीं है, लेकिन मुझे लगता है कि डिफ़ॉल्ट टाइमआउट एक चिंगारी कार्य नहीं है यहां बहुत लंबा (1.7 एच)।

कोई भी मुझे इस मुद्दे के आसपास काम करने के लिए आदर्श प्रदान करता है ???

+0

हो सकता है कि यह समझने में कुछ समय लगे कि यह क्यों हो रहा है और देखें कि क्या आप इससे बच सकते हैं। अधिकांश बार, ऐसा इसलिए होता है क्योंकि विभाजन कुंजी के समान समान रूप से संतुलित नहीं होता है जिसके परिणामस्वरूप कुछ कुंजियों और कुछ अन्य मूल्यों के साथ कुछ कुंजियां होती हैं। – hveiga

उत्तर

13

स्पार्क के कार्यों को मारने का कोई तरीका नहीं है यदि यह बहुत लंबा समय लेता है।

लेकिन मैं 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(); 
} 
0

चाल यहाँ कार्यकर्ता नोड के लिए सीधे प्रवेश और प्रक्रिया को मारने के लिए है। आम तौर पर आप top, ps, और grep के संयोजन के साथ अपमानजनक प्रक्रिया पा सकते हैं। फिर बस kill pid करें।

संबंधित मुद्दे

 संबंधित मुद्दे