2016-04-17 12 views
10

में प्रति कार्य CPUs की संख्या मुझे spark.task.cpus पैरामीटर समझ में नहीं आता है। ऐसा लगता है कि एक "कार्य" निष्पादक के भीतर, "थ्रेड" या "प्रक्रिया" से मेल खाता है। मान लीजिए मैं करने के लिए 2.स्पार्क

  1. "spark.task.cpus" सेट है कि कैसे एक धागा दो CPUs एक साथ उपयोग कर सकते हैं? क्या इसे ताले की आवश्यकता नहीं हो सकती है और सिंक्रनाइज़ेशन समस्याओं का कारण बन सकता है?

  2. मैं तैनात/निष्पादक/निष्पादक.scala में launchTask() फ़ंक्शन देख रहा हूं, और मुझे यहां "प्रति कार्य cpus की संख्या" की कोई धारणा नहीं दिखाई दे रही है। तो स्पार्क अंततः स्टैंडअलोन मोड में एक से अधिक सीपीयू को आवंटित करता/करती है?

उत्तर

10

मेरी जानकारी spark.task.cpus का सबसे अच्छा करने के लिए कार्यों की समानांतरवाद को नियंत्रित करता है में आप इस मामले में जहां कुछ विशेष कार्यों अपने स्वयं के आंतरिक (कस्टम) समानांतरवाद के लिए जाना जाता में क्लस्टर।

और अधिक विस्तार में: हम जानते हैं कि spark.cores.max को परिभाषित करता है कि कितने धागे (उर्फ कोर) आपके आवेदन की जरूरत है। यदि आप spark.task.cpus = 1 छोड़ते हैं तो आपके पास एक ही समय में चल रहे समवर्ती स्पार्क कार्यों की # spark.cores.max संख्या होगी।

आप केवल spark.task.cpus बदलने के लिए है, तो आप जानते हैं कि अपने कार्यों को खुद को parallelized (शायद अपने कार्य में से प्रत्येक के दो धागे spawns, बाहरी उपकरण, आदि के साथ सूचना का आदान प्रदान) spark.task.cpus तदनुसार सेट करके, आप एक अच्छा "नागरिक" बन रहे हैं चाहते हैं । अब यदि आपके पास spark.cores.max = 10 है और spark.task.cpus = 2 स्पार्क केवल 10/2 = 5 समवर्ती कार्य करेगा। यह देखते हुए कि आपके कार्यों को आंतरिक रूप से 2 थ्रेड निष्पादित करने की कुल संख्या 10 से अधिक नहीं होगी, इसका मतलब है कि आप कभी भी अपने प्रारंभिक अनुबंध (spark.cores.max द्वारा परिभाषित) से ऊपर नहीं जाते हैं।

+4

मैं जोड़ना होगा कि यह सब 'CPUS_PER_TASK' के रूप में स्रोत से अधिक प्रयोग किया जाता है, हालांकि यह वास्तव में (एक हार्ड सीमा की तुलना में अधिक संसाधनों के उपयोग संकेत) क्रम पर लागू नहीं किया जाता – zero323

+0

की सहायता से आप एक काम आंतरिक रूप से parallelized किया जा सकता है किसी भी उदाहरण है ? @ zero323, CPUS_PER_TASK का उपयोग बहुत उच्च स्तर शेड्यूलिंग सामान में किया जाता है, यह निष्पादक को कभी नहीं पारित किया जा रहा है। तो, मेरा सवाल यह है कि "हम कैसे सुनिश्चित करते हैं कि एक कार्य spark.task.cpus कोर प्राप्त करता है जिसने अनुरोध किया है?" – smz

+1

सबसे आसान तरीका (बहुत उपयोगी नहीं): 'rdd.mapPartitions (_। ToVector.par.map (foo)) '। और अपने दूसरे प्रश्न का उत्तर देने के लिए - हम बस नहीं करते हैं। यह केवल इतना कहता है कि यदि आप चार निष्पादक कोर घोषित करते हैं, और 'spark.task.cpus' बराबर 2 घोषित करते हैं तो यह केवल 2 कार्य शुरू कर सकता है। लेकिन भौतिक कोर आवंटन या इसी तरह की चीजें हैं। स्पार्क में 'कोर' सिर्फ एक धागा है। – zero323