प्रौद्योगिकी साझेदारी

स्पार्क घुमाव——शफल प्रबन्धन

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

ShuffleManager इति

शफल-व्यवस्थायाः प्रवेशद्वारम् । ShuffleManager इत्येतत् driver तथा executor इत्यत्र sparkEnv इत्यत्र निर्मितम् अस्ति । चालके shuffle इति पञ्जीकरणं कृत्वा एक्जीक्यूटिव् मध्ये data पठन्तु लिखन्तु च।

registerShuffle: रजिस्टर shuffle, return shuffleHandle
unregisterShuffle: फेरबदलं निष्कासयन्तु
shuffleBlockResolver: shuffleBlockResolver प्राप्नुवन्तु, यस्य उपयोगः shuffle तथा block इत्येतयोः मध्ये सम्बन्धं नियन्त्रयितुं भवति
getWriter: विभाजनस्य अनुरूपं लेखकं प्राप्य निष्पादकस्य नक्शाकार्य्ये आह्वयन्तु
getReader, getReaderForRange: एकस्य श्रेणीविभाजनस्य पाठकं प्राप्य निष्पादकस्य reduce कार्ये आह्वयन्तु

क्रमबद्धीकरणप्रबन्धक

shuffleManager इत्यस्य एकमात्रं कार्यान्वयनम् अस्ति ।
क्रमाधारित-शफल-मध्ये आगच्छन्तः सन्देशाः विभाजन-अनुसारं क्रमेण भवन्ति, अन्ते च पृथक् सञ्चिका निर्गच्छति ।
न्यूनकः अस्मात् सञ्चिकातः दत्तांशस्य क्षेत्रं पठिष्यति ।
यदा आउटपुट् सञ्चिका स्मृतौ उपयुक्ता भवति तदा क्रमबद्धा मध्यवर्ती परिणामसञ्चिका डिस्कमध्ये प्रक्षिप्ता भविष्यति, एताः मध्यवर्ती सञ्चिकाः आउटपुट् कृते अन्तिमसञ्चिकायां विलीनाः भविष्यन्ति
क्रमाधारित-शफलस्य द्वौ पद्धतौ स्तः - १.

  • क्रमबद्धक्रमणं, क्रमबद्धक्रमणस्य उपयोगाय त्रीणि शर्ताः पूर्तव्याः सन्ति:
    1. न नक्शापक्षीयसंयोजनम्
    2. क्रमबद्धमूल्यस्थापनस्य समर्थनं करोति (KryoSerializer तथा sparkSql कस्टम क्रमाङ्कनकर्ता)
    3. १६७७७२१६ विभाजनात् न्यूनं वा समं वा
  • अन्येषु सर्वेषु प्रकरणेषु अक्रमबद्धक्रमः, अक्रमबद्धक्रमः उपयोक्तुं शक्यते

क्रमबद्धसॉर्टस्य लाभाः
क्रमाङ्कितक्रमणविधौ, शफललेखकः आगच्छन्तं सन्देशं क्रमबद्धं करोति, तान् दत्तांशसंरचने रक्षति, क्रमेण च स्थापयति ।

  1. जावा-वस्तूनाम् स्थाने द्विचक्रीय-दत्तांशस्य क्रमणं : क्रमाङ्कन-क्रियाः जावा-वस्तूनाम् अपेक्षया प्रत्यक्षतया क्रमबद्ध-द्विचक्रीय-दत्तांशस्य उपरि क्रियन्ते, येन स्मृति-उपभोगः न्यूनीकरोति, कचरा-सङ्ग्रहस्य (GC)-उपरिभारः न्यूनीकरोति च
    अस्य अनुकूलनस्य आवश्यकता अस्ति यत् प्रयुक्तस्य अभिलेखक्रमाङ्ककस्य विशिष्टगुणाः सन्ति ये क्रमाङ्कितानां अभिलेखानां क्रमाङ्कनं प्रथमं विना पुनः क्रमेण स्थापयितुं शक्नुवन्ति ।
  2. कुशलः कैश-क्रमण-एल्गोरिदम्: विशेषरूपेण डिजाइनं कृतं कैश-कुशल-सॉर्टर् (ShuffleExternalSorter) उपयुज्यताम्, यः संपीडित-अभिलेख-सूचक-सरणीं विभाजन-ID च क्रमेण स्थापयितुं शक्नोति । प्रति अभिलेखं केवलं ८ बाइट् स्थानं गृहीत्वा, एषा रणनीतिः अधिकानि दत्तांशं संग्रहे उपयुक्तं कर्तुं शक्नोति, तस्मात् कार्यप्रदर्शने सुधारः भवति ।
  3. ओवरफ्लो विलयप्रक्रिया एकस्मिन् विभाजने क्रमबद्धेषु अभिलेखखण्डेषु क्रियते, अनावश्यकदत्तांशरूपान्तरणस्य उपरितनं परिहरन् सम्पूर्णविलयप्रक्रियायाः समये अभिलेखानां क्रमाङ्कनविहीनीकरणस्य आवश्यकता नास्ति
  4. यदि ओवरफ्लो संपीडन कोडेकः संपीडितदत्तांशस्य संयोजनं समर्थयति, तर्हि ओवरफ्लो विलयप्रक्रिया केवलं क्रमबद्धं संपीडितं च ओवरफ्लो विभाजनदत्तांशं संयोजयित्वा अन्तिमनिर्गमविभाजनं निर्माति एतेन कुशलप्रत्यक्षदत्तांशप्रतिलिपिविधिनाम् उपयोगः भवति, यथा NIO मध्ये transferTo, तथा च विलयप्रक्रियायाः समये विसंपीडनस्य अथवा प्रतिलिपिबफरस्य आवंटनस्य आवश्यकता परिहृता भवति, येन समग्रदक्षतायां सुधारः भवति

registerShuffle इति

भिन्न-भिन्न-परिदृश्यानुसारं तत्सम्बद्धं हस्तकं चिनुत । प्राथमिकताक्रमः BypassMergeSortShuffleHandle>SerializedShuffleHandle>BaseShuffleHandle अस्ति

बाईपास-स्थितिः: कोऽपि नक्शा-पक्षः नास्ति, विभाजनानाम् संख्या _SHUFFLE_SORT_BYPASS_MERGE_THRESHOLD_ इत्यस्मात् न्यूना वा समाना वा अस्ति ।

क्रमाङ्कन-हन्डल-स्थितयः: क्रमाङ्कन-वर्गः क्रमबद्ध-वस्तूनाम् प्रवासनं समर्थयति, mapSideCombine-क्रियायाः उपयोगं न करोति, तथा च मातापितृ-आरडीडी-विभाजनस्य संख्या (1 << 24) इत्यस्मात् अधिका नास्ति ।

getWriter

प्रथमं एतत् शफलं संग्रहयन्तु तथा च taskIdMapsForShuffle_ इत्यत्र सूचनां मैप् कुर्वन्तु ।
शफलस्य अनुरूपस्य हन्डलस्य आधारेण तत्सम्बद्धं लेखकं चिनोतु ।
BypassMergeSortShuffleHandle->BypassMergeSortShuffleWriter बाईपास
SerializedShuffleHandle->असुरक्षितShuffleWriter
BaseShuffleHandle-> क्रमबद्धShuffleWriter

unregisterShuffle इति

taskIdMapsForShuffle तत्सम्बद्धं shuffle तथा shuffle तत्सम्बद्धेन मानचित्रेण उत्पन्नानि सञ्चिकानि निष्कासयति

getReader/getReaderForRange इति

shuffle सञ्चिकायाः ​​अनुरूपं सर्वाणि ब्लॉक्-सङ्केतानि प्राप्नुवन्तु, अर्थात् blocksByAddress ।
BlockStoreShuffleReader ऑब्जेक्ट् रचयति, तत् च प्रत्यागच्छति ।

ShuffleHandle इति

मुख्यतया shuffle इत्यस्य पैरामीटर्स् पारयितुं तस्य उपयोगः भवति, अपि च कस्य लेखकस्य चयनं कर्तव्यमिति चिह्नितुं चिह्नम् अपि अस्ति ।

BaseShuffleHandle इति

बाईपासMergeSortShuffleHandle

SerializedShuffleHandle इति क्रमबद्धता

शफललेखक

अमूर्तवर्गः, नक्शाकार्यनिर्गमसन्देशानां उत्तरदायी मुख्यविधिः लेखनम् अस्ति, तथा च त्रयः कार्यान्वयनवर्गाः सन्ति

  • बाईपासMergeSortShuffleWriter
  • क्रमबद्धताShuffleWriter
  • असुरक्षितShuffleWriter

पश्चात् पृथक् पृथक् विश्लेषणं भविष्यति।

ShuffleBlockResolver इति

Trait, कार्यान्वयनवर्गः mapId, reduceId, shuffleId इत्येतयोः आधारेण तत्सम्बद्धं ब्लॉकदत्तांशं प्राप्तुं शक्नोति ।

अनुक्रमणिकाShuffleBlockResolver इति

ShuffleBlockResolver इत्यस्य एकमात्रः कार्यान्वयनवर्गः ।
एकस्मात् मानचित्रकार्यात् शफलब्लॉकदत्तांशस्य कृते तार्किकखण्डानां भौतिकसञ्चिकास्थानानां च मध्ये मैपिंगं निर्माय परिपालयन्तु ।
एकस्यैव मानचित्रकार्यस्य शफलखण्डदत्तांशः समेकितदत्तांशसञ्चिकायां संगृहीतः भविष्यति ।
दत्तांशसञ्चिकायां एतेषां दत्तांशखण्डानां आफ्सेट् पृथक् पृथक् अनुक्रमणिकासञ्चिकायां संगृहीताः भवन्ति ।
.data इति दत्तांशसञ्चिकाप्रत्ययः
.index इति अनुक्रमणिकासञ्चिकाप्रत्ययः

getDataFile प्राप्त करें

दत्तांशसञ्चिकां प्राप्नुवन्तु।
ShuffleDataBlockId उत्पन्नं कृत्वा सञ्चिकां प्राप्तुं blockManager.diskBlockManager.getFile मेथड् आह्वयन्तु

getIndexFile इति

getDataFile इत्यस्य सदृशम्
ShuffleIndexBlockId उत्पन्नं कृत्वा सञ्चिकां प्राप्तुं blockManager.diskBlockManager.getFile मेथड् आह्वयन्तु

removeDataByMap

shuffleId तथा mapId इत्येतयोः आधारेण दत्तांशसञ्चिकां अनुक्रमणिकासञ्चिकां च प्राप्नुवन्तु, ततः तान् विलोपयन्तु

writeIndexFileAndCommit इति लिखन्तु

mapId तथा shuffleId इत्येतयोः अनुसारं तत्सम्बद्धं दत्तांशसञ्चिकां अनुक्रमणिकासञ्चिकां च प्राप्नुवन्तु ।
दत्तांशसञ्चिका अनुक्रमणिकासञ्चिका च सन्ति वा मेलनं च वा इति पश्यन्तु, प्रत्यक्षतया च प्रत्यागच्छन्तु ।
यदि तत् मेलनं कर्तुं न शक्नोति तर्हि नूतना अनुक्रमणिका अस्थायी सञ्चिका उत्पद्यते । ततः उत्पन्नं अनुक्रमणिकासञ्चिकां दत्तांशसञ्चिकां च नाम परिवर्त्य प्रत्यागच्छतु ।


कल्पयतु यत् shuffle इत्यस्य त्रयः विभाजनाः सन्ति, तदनुरूपाः दत्तांशस्य आकाराः क्रमशः 1000, 1500, 2500 च सन्ति ।
अनुक्रमणिकासञ्चिकायां प्रथमपङ्क्तिः 0, तदनन्तरं विभाजनदत्तांशस्य सञ्चितमूल्यं द्वितीयपङ्क्तिः 1000, तृतीयपङ्क्तिः 1000+1500=2500, तृतीयपङ्क्तिः 2500+2500=5000 च भवति ।
दत्तांशसञ्चिकाः विभाजनआकारेन क्रमेण संगृह्यन्ते ।

checkIndexAndDataFile इति सञ्चिकां पश्यन्तु

यदि ते मेलनं न कुर्वन्ति तर्हि null प्रत्यागच्छति तर्हि विभाजन-आकारस्य सरणी प्रत्यागच्छति ।
1.सूचकाङ्कसञ्चिकायाः ​​आकारः (blocks + 1) * 8L अस्ति
2.सूचकाङ्कसञ्चिकायाः ​​प्रथमपङ्क्तिः 0 अस्ति
3. विभाजनस्य आकारं प्राप्य दीर्घतासु लिखन्तु दीर्घतायाः सारांशमूल्यं दत्तांशसञ्चिकायाः ​​आकारस्य बराबरम् अस्ति ।
यदि उपर्युक्ताः त्रयः शर्ताः पूर्यन्ते तर्हि lengths प्रत्यागच्छति, अन्यथा null प्रत्यागच्छति ।

getBlockData

shuffleId, mapId, startReduceId, endReduceId प्राप्तुम्
अनुक्रमणिकासञ्चिकां प्राप्नुत
तत्सम्बद्धं startOffset तथा ​​endOffset पठन्तु
FileSegmentManagedBuffer उत्पन्नं कर्तुं प्रत्यागमनाय च data file, startOffset, endOffset इत्येतयोः उपयोगं कुर्वन्तु