Map Reduce Programming में reducer में फेरबदल और छँटाई के उद्देश्य क्या है?


113

मैप रिड्यूस प्रोग्रामिंग में कम चरण में इसके उप-भागों के रूप में फेरबदल, छंटाई और कम करना है। छंटनी एक महंगा मामला है।

Map Reduce Programming में reducer में फेरबदल और छँटाई के उद्देश्य क्या है?


3
मैंने हमेशा माना है कि यह आवश्यक था क्योंकि मैपर से आउटपुट रिड्यूसर के लिए इनपुट है, इसलिए इसे कीस्पेस के आधार पर सॉर्ट किया गया था और फिर प्रत्येक रिड्यूसर इनपुट के लिए बकेट में विभाजित किया गया था।
बेसिकहॉरिज़न

जवाबों:


171

सबसे पहले shufflingमैपर से रिड्यूसर में डेटा ट्रांसफर करने की प्रक्रिया है, इसलिए मुझे लगता है कि यह स्पष्ट है कि रिड्यूसर के लिए यह आवश्यक है, अन्यथा, वे किसी भी इनपुट (या हर मैपर से इनपुट) नहीं कर पाएंगे । कुछ समय बचाने के लिए, नक्शा चरण समाप्त होने से पहले भी फेरबदल शुरू हो सकता है। इसीलिए जब आप मानचित्र की स्थिति अभी भी 100% नहीं है, तो आप 0% (लेकिन 33% से कम) से कम स्थिति देख सकते हैं।

Sortingरेड्यूसर के लिए समय बचाता है, आसानी से अंतर करने में मदद करता है जब एक नया कम कार्य शुरू होना चाहिए। यह बस एक नया कम कार्य शुरू करता है, जब सॉर्ट किए गए इनपुट डेटा में अगली कुंजी बस इसे डालने के लिए पिछले की तुलना में अलग है। प्रत्येक कम कार्य कुंजी-मूल्य जोड़े की एक सूची लेता है, लेकिन इसे कम () विधि को कॉल करना पड़ता है जो एक कुंजी-सूची (मान) इनपुट लेता है, इसलिए इसे कुंजी द्वारा समूह मान देना होता है। ऐसा करना आसान है, यदि इनपुट डेटा मानचित्र चरण में पूर्व-क्रमबद्ध (स्थानीय रूप से) है और बस कम चरण में विलय हो जाता है (चूंकि reducers कई मैपर्स से डेटा प्राप्त करते हैं)।

Partitioning, कि आपने एक उत्तर में उल्लेख किया है, एक अलग प्रक्रिया है। यह निर्धारित करता है कि नक्शा चरण के आउटपुट (कुंजी, मूल्य) जोड़ी, आउटपुट भेजा जाएगा। डिफ़ॉल्ट पार्टीशनर उन्हें कम किए गए कार्यों को वितरित करने के लिए कुंजियों पर एक हैशिंग का उपयोग करता है, लेकिन आप इसे ओवरराइड कर सकते हैं और अपने स्वयं के कस्टम विभाजनकर्ता का उपयोग कर सकते हैं।

इन चरणों की जानकारी का एक बड़ा स्रोत याहू ट्यूटोरियल है

इसका एक अच्छा चित्रमय प्रतिनिधित्व निम्नलिखित है (फेरबदल को इस आंकड़े में "प्रतिलिपि" कहा जाता है):

यहां छवि विवरण दर्ज करें

ध्यान दें कि shufflingऔर sortingसब पर प्रदर्शन नहीं कर रहे हैं यदि आप शून्य reducers निर्दिष्ट (setNumReduceTasks (0))। फिर, MapReduce का कार्य मैप चरण पर रुक जाता है, और मैप चरण में किसी भी प्रकार की छंटाई शामिल नहीं होती है (इसलिए मानचित्र चरण भी तेज़ होता है)।

अद्यतन: जब से आप कुछ और आधिकारिक की तलाश कर रहे हैं, तो आप टॉम व्हाइट की पुस्तक "हडोप: द डेफिनिटिव गाइड" भी पढ़ सकते हैं। यहां आपके प्रश्न का दिलचस्प हिस्सा है।
टॉम व्हाइट फरवरी 2007 से एक अपाचे हडोप कम्यूटेटर है, और अपाचे सॉफ्टवेयर फाउंडेशन का सदस्य है, इसलिए मुझे लगता है कि यह बहुत विश्वसनीय और आधिकारिक है ...


"सॉर्टिंग reducer के लिए समय बचाता है, इसे आसानी से अलग करने में मदद करता है जब एक नया कम कार्य शुरू होना चाहिए। यह बस एक नया कम कार्य शुरू करता है, जब सॉर्ट किए गए इनपुट डेटा में अगली कुंजी बस इसे डालने के लिए पिछले की तुलना में अलग होती है।" मुझे यह हिस्सा नहीं मिला। मैपर विभाजन को फैलाने के लिए एक विभाजनक का उपयोग करता है, स्थानीय रूप से विभाजन को विभाजित करता है, फिर प्रत्येक विभाजन को घटाता है। कैसे छँटाई यहाँ मदद करता है?
MaxNevermind

1
@MaxNevermind यदि आपके पास x कार्य (विभाजन) कम हैं, तो इसका मतलब यह नहीं है कि आप x (x) विधि को कम करके कॉल करेंगे। यह हर अलग कुंजी के लिए एक बार कहा जाएगा। तो एक कम कार्य कई बार कम () विधि को कॉल कर सकता है।
vefthym

"इसे हर अलग कुंजी के लिए एक बार बुलाया जाएगा" क्यों? मैपर विभाजन को बनाता है जो भी जिस तरह से चाहता है (प्रत्येक अलग कुंजी के लिए एक विभाजन आवश्यक नहीं है), फिर प्रत्येक विभाजन reducer पर जाता है, क्या यह गलत है?
मैक्सएनविंडम

1
@MaxNevermind मैपर चाबियों और मूल्यों को आउटपुट करता है, यह विभाजन नहीं बनाता है। विभाजन को उन कार्यों को कम करने से परिभाषित किया जाता है जिन्हें उपयोगकर्ता परिभाषित करता है और विभाजन कार्यान्वयन। एक ही कुंजी वाले सभी मैपर के आउटपुट एक ही कम () विधि पर जा रहे हैं। इसे बदला नहीं जा सकता। लेकिन जो बदला जा सकता है वह वही है जो अन्य कुंजियों (यदि कोई हो) को एक ही विभाजन में रखा जाएगा और इस प्रकार, उसी कार्य को संभाला जाएगा। एक कम कार्य कॉल को कम कर सकता है () एक से अधिक बार कार्य करता है, लेकिन हर कुंजी के लिए केवल एक बार।
18th पर vefthym

2
ठीक है मुझे लगता है कि मुझे मिल गया है। मेरी समस्या यह थी कि मैं यह भूल गया था कि कम करने के लिए मूल्यों की एक सूची होती है एक तर्क के रूप में न केवल एक कुंजी-मूल्य जोड़ी। मुझे लगता है कि आपको अपने उत्तर में इसे विस्तृत करना चाहिए: "प्रत्येक कम कार्य कुंजी-मूल्य जोड़े की एक सूची लेता है, लेकिन इसे कम करने की विधि को कॉल करना पड़ता है जो कुंजी-सूची <मूल्य> लेता है, इसलिए इसे कुंजी द्वारा समूह मान देना आसान है। यदि इनपुट डेटा एक मैपर चरण में पूर्व-सॉर्ट किया जाता है "
MaxNevermind

42

आइए Mapreduce प्रोग्राम के मुख्य चरणों को फिर से देखें।

नक्शा चरण मानचित्रकारों द्वारा किया जाता है। मैपर अनसोल्ड इनपुट की / वैल्यू पेयर पर चलते हैं। प्रत्येक मैपर प्रत्येक इनपुट कुंजी / मान जोड़े के लिए शून्य, एक या कई आउटपुट कुंजी / मान जोड़े का उत्सर्जन करता है।

गठबंधन चरण समेलक द्वारा किया जाता है। Combiner एक ही कुंजी के साथ कुंजी / मान जोड़े संयोजित करने होंगे। प्रत्येक कंबाइनर शून्य, एक बार या कई बार चल सकता है।

फेरबदल और प्रकार चरण रूपरेखा द्वारा किया जाता है। सभी मैपर्स के डेटा को कुंजी द्वारा समूहीकृत किया जाता है, पुनर्विक्रेताओं के बीच विभाजित किया जाता है और कुंजी द्वारा क्रमबद्ध किया जाता है। प्रत्येक reducer एक ही कुंजी के साथ जुड़े सभी मूल्यों को प्राप्त करता है। प्रोग्रामर छँटाई के लिए कस्टम तुलना कार्यों और डेटा विभाजन के लिए एक विभाजनक की आपूर्ति कर सकता है ।

विभाजक का फैसला करता है जो कम करने के लिए एक विशेष कुंजी मान जोड़ी मिल जाएगा।

कम करने प्राप्त कुंजी / [मूल्यों सूची] जोड़े के अनुसार क्रमबद्ध, कुंजी के अनुसार क्रमबद्ध। मान सूची में मैपर्स द्वारा उत्पादित एक ही कुंजी के साथ सभी मान शामिल हैं। प्रत्येक रिड्यूसर प्रत्येक इनपुट कुंजी / वैल्यू पेयर के लिए शून्य, एक या कई आउटपुट कुंजी / मान जोड़े का उत्सर्जन करता है

एक बेहतर समझ के लिए दत्ता द्वारा मारिया जुरकोविकोवा और mssqltltips लेख के इस javacodegeeks लेख पर एक नज़र है

नीचे safaribooksonline लेख से छवि है

यहां छवि विवरण दर्ज करें


मुझे लगता है कि छवि में एक टाइपो है (जो मुझे एहसास है कि बस यहां कॉपी किया गया है)। मेरा मानना ​​है कि ieReducers और Output के स्ट्रिंग्स वास्तव में होने चाहिए is
जेफ इवांस

32

मैंने उपरोक्त उत्तरों में गायब कुछ बिंदुओं को जोड़ने के बारे में सोचा। यहाँ से लिया गया यह चित्र स्पष्ट रूप से बताता है कि वास्तव में क्या हो रहा है।

यहां छवि विवरण दर्ज करें

अगर मैं फिर से वास्तविक उद्देश्य के बारे में बताता हूं

  • स्प्लिट: विभिन्न नोड्स (मैपर) में प्रसंस्करण भार को वितरित करके समानांतर प्रसंस्करण में सुधार करता है, जो समग्र प्रसंस्करण समय को बचाएगा।

  • गठबंधन: प्रत्येक मैपर के उत्पादन को सिकोड़ता है। यह डेटा को एक नोड से दूसरे तक ले जाने में लगने वाले समय की बचत करेगा।

  • सॉर्ट (शफल और सॉर्ट): नए रेड्यूसर को शेड्यूल (स्पॉन / स्टार्ट) करने के लिए रन-टाइम के लिए आसान बनाता है, जहां सॉर्ट किए गए आइटम सूची से गुजरते समय, जब भी वर्तमान कुंजी पिछले से अलग होती है, तो यह एक नया रिड्यूसर स्पॉन कर सकता है। ।


इस ग्राफ में विभाजन का कदम कहां आएगा? मानचित्र के बाद और संयोजन से पहले?
जोएल

@ मुझे उम्मीद है कि आप 'स्प्लिट' स्टेप का उल्लेख करेंगे?
सुपुन विजयरथने

नहीं, मेरा मतलब है कि विभाजन कदम, यह तय करता है कि किस डेटा को डेटा भेजना है, डिफ़ॉल्ट रूप से एक साधारण हैश मोडुलो का उपयोग करते हुए, कुछ और शोध के बाद मेरा मानना ​​है कि यह संयोजन के बाद आता है, फेरबदल और छाँटने से पहले।
जोएल

1
@ जॉयल मैं बहुत स्पष्ट नहीं हूं कि आप क्या वर्णन करना चाहते हैं। संक्षेप में, चरणों का सटीक क्रम बहुत अधिक समस्या-विशिष्ट हो सकता है। मैं कह सकता हूं कि कुछ परिदृश्यों के लिए भी छंटाई आवश्यक नहीं है। आपके इनपुट पर वापस आते हुए, अगर मैं विशेष रूप से उपरोक्त सरल वर्डकाउंट उदाहरण के बारे में बात करता हूं, तो मुझे वास्तव में इस तरह के विभाजन की कोई आवश्यकता नहीं है कि रिड्यूसर तय करें। यहाँ यह स्पॉन के लिए काफी सीधा है प्रति कुंजी कम कर देता है। लेकिन मैं अनुमान लगा सकता हूं कि आपकी बात कुछ परिदृश्यों के लिए मान्य हो सकती है। सच कहूँ तो, मेरे पास इसके बारे में एक सटीक स्पष्ट विचार नहीं है।
सुपुन विजयरथने

4

डेटा प्रोसेसिंग आवश्यकताओं में से कुछ की आवश्यकता नहीं है। Syncsort ने Hadoop में प्लगिंग को छँटनी योग्य बनाया था। यहाँ छँटाई पर उनसे एक अच्छा ब्लॉग है। डेटा को मैपर्स से रिड्यूसर्स में स्थानांतरित करने की प्रक्रिया को फेरबदल कहा जाता है, उसी पर अधिक जानकारी के लिए इस लेख की जांच करें


2

मैंने हमेशा माना है कि यह आवश्यक था क्योंकि मैपर से आउटपुट रिड्यूसर के लिए इनपुट है, इसलिए इसे कीस्पेस के आधार पर सॉर्ट किया गया था और फिर प्रत्येक रिड्यूसर इनपुट के लिए बकेट में विभाजित किया गया था। आप एक ही बाल्टी में की एंड के सभी समान मूल्यों को सुनिश्चित करना चाहते हैं ताकि वे एक साथ कम हो जाएं। अलग-अलग रिड्यूसर को K1, V2 और K1, V4 भेजने का कोई मतलब नहीं है क्योंकि उन्हें कम करने के लिए एक साथ होने की आवश्यकता होती है।

जितनी जल्दी हो सके इसे समझाने की कोशिश की


अगर हम k1, v1 और k1, v4 को उसी reducer पर भेजना चाहते हैं तो हम फेरबदल कर सकते हैं। फिर छाँटने का उद्देश्य क्या है?
नितिन के अनिल

यह कई कारणों से छँटाई करता है, एक कारण यह है, जब एक MapReduce Job सभी KV जोड़े को रिड्यूसर पर भेज रहा है यदि इनपुट सॉर्ट नहीं किया गया है तो K1, VX के हर उदाहरण को लेने के लिए सभी Mapper आउटपुट को स्कैन करना होगा। । जबकि यदि K2 जैसे ही Mapper आउटपुट को सॉर्ट किया जाता है, VX उठाया जाता है, तो आप जानते हैं कि K1, VX सभी को उठा लिया गया है और उस सेट को प्रसंस्करण के लिए एक reducer पर भेजा जा सकता है, इसका लाभ यह नहीं है कम करने के लिए उनमें से प्रत्येक के लिए तैयार करने के लिए हर रेड्यूसर के लिए इंतजार करना होगा।
बेसिकहोराइज़न

इसके अलावा जब यह एकत्रीकरण की बात आती है, यदि आप निर्दिष्ट करते हैं कि आप K1 के सभी को अलग करना चाहते हैं, तो V1 यदि Reducer पर इनपुट को छांटा जाता है जैसे ही Reducer K2 पर उठाता है, V2 यह जानता है कि K1, V1 का कोई और उदाहरण नहीं है। यह एकत्रीकरण को समाप्त कर सकता है जबकि अगर reducer इनपुट को छांटा नहीं गया है तो उसे K1, V1
BasicHorizon

2

शफलिंग वह प्रक्रिया है जिसके द्वारा मैपर्स से मध्यवर्ती डेटा को 0,1 या अधिक रिड्यूसर में स्थानांतरित किया जाता है। प्रत्येक रिड्यूसर को 1 या अधिक कुंजियाँ और इसके संबद्ध मान रिड्यूसर की संख्या (एक संतुलित लोड के लिए) के आधार पर प्राप्त होते हैं। इसके अलावा प्रत्येक कुंजी से जुड़े मान स्थानीय रूप से सॉर्ट किए जाते हैं।


0

MapReduce NATIVELY: सॉर्ट और (सॉर्ट द्वारा लागू) स्केलेबल GroupBy केवल दो चीजें हैं।

MapReduce पर अधिकांश एप्लिकेशन और डिज़ाइन पैटर्न इन दो ऑपरेशनों पर बनाए गए हैं, जो कि फेरबदल और सॉर्ट द्वारा प्रदान किए जाते हैं।


0

यह एक अच्छी रीडिंग है। आशा करता हूँ की ये काम करेगा। आपके द्वारा छांटे जाने के संदर्भ में, मुझे लगता है कि यह मानचित्र के अंतिम चरण में मर्ज ऑपरेशन के लिए है। जब मानचित्र संचालन किया जाता है, और परिणाम को स्थानीय डिस्क पर लिखने की आवश्यकता होती है, तो बफर से उत्पन्न विभाजन पर एक बहु-मर्ज संचालित किया जाएगा। और एक मर्ज ऑपरेशन के लिए, उन्नत में प्रत्येक विभाजन को छांटना मददगार होता है।


0

ठीक है, में MapReduce वहाँ दो महत्वपूर्ण वाक्यांशों कहा जाता है मैपर और कम करने के लिए दोनों बहुत महत्वपूर्ण हैं, लेकिन प्रसारण अनिवार्य है। कुछ कार्यक्रमों में reducers वैकल्पिक हैं। अब आपके सवाल पर आता हूं। मेप्रेडिसेस में फेरबदल और छंटाई दो महत्वपूर्ण ऑपरेशन हैं। पहले Hadoop फ्रेमवर्क संरचित / असंरचित डेटा लेता है और डेटा को Key, Value में अलग करता है।

अब मैपर प्रोग्राम को अलग किया जाता है और डेटा को संसाधित करने के लिए कुंजी और मान में व्यवस्थित करता है। कुंजी 2 और मान 2 मान उत्पन्न करें। यह मान वांछित समाधान प्राप्त करने के लिए उचित क्रम में प्रक्रिया और पुन: व्यवस्था करना चाहिए। अब यह फेरबदल और आपके स्थानीय सिस्टम में की गई छंटनी (फ्रेमवर्क इसे ध्यान में रखता है) और प्रक्रिया के बाद स्थानीय प्रणाली में प्रक्रिया स्थानीय डेटा में डेटा की सफाई करती है। ठीक

यहां हम इस फेरबदल और सॉर्ट प्रक्रिया को अनुकूलित करने के लिए कंबाइनर और विभाजन का भी उपयोग करते हैं। उचित व्यवस्था के बाद, उन महत्वपूर्ण मानों को वांछित ग्राहक का आउटपुट प्राप्त करने के लिए Reducer पास करता है। अंत में Reducer वांछित उत्पादन प्राप्त करते हैं।

के 1, वी 1 -> के 2, वी 2 (हम प्रोग्राम मैपर लिखेंगे), -> के 2, वी '(यहां डेटा को फेरबदल और नरम करें) -> के 3, वी 3 आउटपुट उत्पन्न करते हैं। K4, V4।

कृपया ध्यान दें कि ये सभी चरण केवल तार्किक संचालन हैं, मूल डेटा को नहीं बदलते हैं।

आपका प्रश्न: मैप रिड्यूस प्रोग्रामिंग में रिड्यूसर में फेरबदल और छँटाई का क्या उद्देश्य है?

संक्षिप्त उत्तर: वांछित आउटपुट प्राप्त करने के लिए डेटा को संसाधित करना। फेरबदल डेटा कुल है, कम अपेक्षित उत्पादन मिलता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.