2011-06-02 30 views
8

एक विशिष्ट MapReduce सेटअप (जैसे हैडोप) में, 1 कार्य के लिए कितने reducer का उपयोग किया जाता है, उदाहरण के लिए, शब्दों की गिनती? Google से उस MapReduce की मेरी समझ का मतलब है केवल 1 reducer शामिल है। क्या वो सही है?MapReduce में 1 कार्य के लिए reducers की संख्या

उदाहरण के लिए, शब्द गणना इनपुट को एन भाग में विभाजित करेगी, और एन मानचित्र चल रहा है, (शब्द, #) सूची का उत्पादन करेगा। मेरा सवाल यह है कि, मानचित्र चरण पूरा होने के बाद, परिणाम की गणना करने के लिए केवल एक reducer उदाहरण चल रहा होगा? या समानांतर में चल रहे reducers होगा?

+1

आपके प्रश्न में कुछ और संदर्भ की कमी है। क्या आपके पास एक विशेष मैप्रिडस ढांचा है जिसका आप संदर्भ हैं यानी हडोप। और यदि ऐसा है तो आप पूछ रहे हैं कि प्रत्येक कार्य "कार्य" से कितने "कार्यों" को कम किया जाएगा? – diliop

+1

मैंने प्रश्न अपडेट किया है। –

+0

संक्षिप्त उत्तर यह है कि एक कम करने योग्य संख्या में reducers (कम से कम 1) होगा। –

उत्तर

13

सरल जवाब यह है कि reducers की संख्या 1 और हां नहीं है, reducers समानांतर में चला सकते हैं। जैसा कि मैंने उपरोक्त उल्लेख किया है, यह उपयोगकर्ता परिभाषित या व्युत्पन्न है।

चीजों को संदर्भ में रखने के लिए मैं इस मामले में हडोप का उल्लेख करूंगा ताकि आपको पता चल सके कि चीजें कैसे काम करती हैं। यदि आप हैडोप (0.20.2) में स्ट्रीमिंग एपीआई का उपयोग कर रहे हैं तो आपको स्पष्ट रूप से परिभाषित करना होगा कि डिफ़ॉल्ट रूप से आप कितने रेड्यूसर को चलाना चाहते हैं, केवल 1 कम कार्य लॉन्च किया जाएगा। आप -D mapred.reduce.tasks=# of reducers तर्क में reducers की संख्या पारित करके ऐसा करते हैं। जावा एपीआई आपको आवश्यक reducers की संख्या प्राप्त करने का प्रयास करेगा, लेकिन फिर आप इसे स्पष्ट रूप से भी सेट कर सकते हैं। दोनों स्थितियों में, प्रति नोड चलाने वाले रेड्यूसर की संख्या पर एक हार्ड कैप है और यह mapred.tasktracker.reduce.tasks.maximum का उपयोग कर mapred-site.xml कॉन्फ़िगरेशन फ़ाइल में सेट है।

एक और वैचारिक नोट पर, आप हडूप विकी पर this पोस्ट देख सकते हैं जो मानचित्र की संख्या चुनने और कार्यों को कम करने के बारे में बात करता है।

+0

हडोप रेड्यूसर कक्षा के एक से अधिक उदाहरणों को तुरंत चालू करने का निर्णय लेने के लिए कौन सी स्थितियों का कारण बनेंगे? यदि हम # reducers को 1 पर सेट करते हैं तो क्या यह वास्तव में गारंटी देता है कि सभी चाबियाँ एक ही उदाहरण पर जाएंगी, इससे कोई फर्क नहीं पड़ता कि कितने? – davidmdem

+0

संस्करण 2.4.1 के बाद कहीं भी संपत्ति: "mapred.tasktracker.reduce.tasks.maximum" को हटा दिया गया है, नया प्रॉपर्टी नाम है: "mapreduce.tasktracker.reduce.tasks.maximum" देखें: http: // hadoop। apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-common/DeprecatedProperties.html – xgMz

1

यह पूरी तरह से स्थिति पर निर्भर करता है। कुछ मामलों में, आपके पास कोई reducers नहीं है ... सब कुछ मैपसाइड किया जा सकता है। अन्य मामलों में, आप एक reducer होने से नहीं बच सकते हैं, लेकिन आम तौर पर यह दूसरे या तीसरे नक्शे में आता है/नौकरी को कम करता है जो पहले के परिणामों को नियंत्रित करता है। आम तौर पर, हालांकि, आप बहुत सारे reducers चाहते हैं या अन्यथा आप MapReduce की बहुत सारी शक्ति खो रहे हैं! शब्द गणना में, उदाहरण के लिए, आपके मैपर का परिणाम जोड़े होंगे। इन जोड़े को तब शब्द के आधार पर विभाजित किया जाता है जैसे कि प्रत्येक रेड्यूसर को वही शब्द मिलेंगे, और आपको अंतिम योग दे सकते हैं। प्रत्येक reducer तो परिणाम outputs। यदि आप चाहते थे, तो आप एक और एम/आर नौकरी बंद कर सकते थे जिसने इन सभी फाइलों को लिया और उन्हें संयोजित किया - उस नौकरी में केवल एक reducer होगा।

1

मैं सरल शब्द गणना उदाहरण के मामले में केवल एक reducer का उपयोग करने के लिए समझ में आता है।
यदि आप गणना के परिणामस्वरूप केवल एक नंबर के रूप में होना चाहते हैं तो आपको एक रेड्यूसर का उपयोग करना होगा (2 या अधिक रेड्यूसर आपको 2 या अधिक आउटपुट फाइलें देंगे)।

यदि इस reducer को पूरा करने में लंबा समय लग रहा है तो आप कई reducers चेनिंग के बारे में सोच सकते हैं जहां अगले चरण में reducers पिछले reducers के परिणाम मिलेगा।

0

रेड्यूसर समानांतर में चलता है। कॉन्फ़िगरेशन फ़ाइल mapred-site.xml को बदलने के दौरान आपके द्वारा सेट की गई रेड्यूसर की संख्या या रनिंग जॉब के कमांड के दौरान रेड्यूसर सेट करके या आप प्रोग्राम में इसे सेट कर सकते हैं, यह भी कि रेड्यूसर की संख्या समानांतर चलती है। इसे 1 के रूप में रखना जरूरी नहीं है। डिफ़ॉल्ट रूप से इसका मान 1.

+0

क्या आप अपने समाधान को आपके द्वारा प्रदान किए गए समाधान के बारे में थोड़ा और विवरण जोड़कर विस्तारित कर सकते हैं? – abarisone

+0

एक नौकरी या एक कार्य में आप एक से अधिक reducer हो सकता है। आप reducer की संख्या तीन तरीकों से सेट कर सकते हैं: 1) mapred-site.xml फ़ाइल में मूल्य chaning। 2) नौकरी चलाने के दौरान -D mapred.reduce.task = 4 (यह कोई संख्या हो सकती है)। 3) अपने कॉन्फ़िगरेशन ऑब्जेक्ट को ड्राइवर कोड में conf.setNumReduceTask (4) के रूप में सेट करना; –

0

डिफ़ॉल्ट मान 1. यदि आप हाइव या सुअर पर विचार कर रहे हैं, तो रेड्यूसर की संख्या क्वेरी पर निर्भर करती है, जैसे समूह द्वारा, योग .....

आपके मैप्रेडस कोड के मामले में, इसे नौकरी/conf पर setNumReduceTasks द्वारा परिभाषित किया जा सकता है।

job.setNumReduceTasks(3); 

बार यह किया जाता है के अधिकांश जब आप getPartition() के ऊपर लिख, अर्थातआप एक कस्टम विभाजनकर्ता

class customPartitioner extends Partitioner<Text,Text>{ 
    public int getPartition(Text key, Text value, int numReduceTasks){ 
    if(numReduceTasks==0) 
     return 0; 
    if(some logic) 
     return 0; 
    if(some logic) 
     return 1; 
    else 
     return 2; 
    } 
} 

एक बात आपको नोटिस होगी कि रेड्यूसर की संख्या = आउटपुट में भाग फ़ाइल की संख्या का उपयोग कर रहे हैं।

यदि आपको संदेह है तो मुझे बताएं।

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