2013-02-06 15 views
18

को कम करना है, मैं जानना चाहता हूं कि समूहिंग तुलनित्र माध्यमिक प्रकार के मैड्रिड में क्यों उपयोग किया जाता है।हडूप मानचित्र में समूहीकरण समूह के उपयोग का क्या उपयोग

(उतरते) छँटाई

हम सॉर्ट क्रम कुंजी तापमान वर्ष (आरोही) और फिर से होने के लिए चाहते हैं माध्यमिक की निश्चित गाइड उदाहरण के अनुसार:

1900 35°C 
1900 34°C 
1900 34°C 
... 
1901 36°C 
1901 35°C 

एक की स्थापना करके कुंजी के वर्ष भाग द्वारा विभाजित करने के लिए विभाजनकर्ता, हम गारंटी दे सकते हैं कि उसी वर्ष के लिए रिकॉर्ड उसी रेड्यूसर पर जाएं। हालांकि, यह अभी भी हमारे लक्ष्य को प्राप्त करने के लिए पर्याप्त नहीं है। एक विभाजनकर्ता केवल यह सुनिश्चित करता है कि एक रेड्यूसर को एक वर्ष के लिए सभी रिकॉर्ड प्राप्त हों; यह इस तथ्य को नहीं बदलेगा कि विभाजन के भीतर कुंजी द्वारा reducer समूह।

चूंकि हम पहले से ही अपना स्वयं का विभाजनकर्ता लिख ​​चुके होंगे जो विशेष रूप से रेड्यूसर पर जाने वाले मानचित्र आउटपुट कुंजियों का ख्याल रखेगा, तो हमें इसे क्यों समूहित करना चाहिए।

अग्रिम धन्यवाद

उत्तर

30

चुना जवाब के समर्थन में मैं जोड़ें:

से this explanation

इनपुट इसे जारी रखते हुए:

symbol time price 
a  1 10 
a  2 20 
b  3 30 

मानचित्र उत्पादन: तो जैसे समग्र कुंजी \ मान बनाने:

प्रतीक समय समय मूल्य

एक-1                   1-10

एक-2                   2-20

ख-3                   3-30

विभाजनर: रूट किया जाएगा एक ही कम करने के लिए एक-1 और एक-2 कुंजी कुंजियाँ अलग होने के बावजूद । यह बी -3 को अलग रेड्यूसर तक भी रूट करेगा।

GroupComparator: एक बार कंपोजिट कुंजी \ मूल्य कम करने के लिए हो रही

(एक -1, {} 1-10)

(एक करने के बजाय कम करने पर पहुंचने 2, {} 2-20)

ऊपर d क्या होगा संरचना के बाद अद्वितीय कुंजी मानों के कारण।

समूह तुलनित्र कम करने से यह सुनिश्चित होगा हो जाता है:

(एक, {1-10,2-20}) विधि

[[एक एकल में कम हो कॉल करें।]]

+0

के लिए डेटा को रेड्यूसर में पास किए जाने वाले सभी रविवारों का तापमान अच्छा स्पष्टीकरण .. –

2

आप एक मध्यवर्ती कुंजी साल और तापमान के एक समग्र है कि लागू करने के लिए की जरूरत है; प्राकृतिक कुंजी (वर्ष) पर विभाजन और एक तुलनित्र पेश करें जो संपूर्ण समग्र कुंजी को सॉर्ट करेगा। आप सही हैं कि वर्ष पर विभाजन करके आपको एक ही रेड्यूसर में एक वर्ष के लिए सभी डेटा मिलेंगे, इसलिए तुलनित्र प्रत्येक वर्ष तापमान के अनुसार डेटा को प्रभावी ढंग से सॉर्ट करेगा।

22

मुझे बयान में सुधार करने दें "... विशेष रूप से reducer पर जाने वाले मानचित्र आउटपुट कुंजी का ख्याल रखना"।

रेड्यूसर इंस्टेंस बनाम विधि को कम करें: एक जेवीएम प्रति कम कार्य को बनाया गया है और इनमें से प्रत्येक में रेड्यूसर क्लास का एक उदाहरण है। यह रेड्यूसर इंस्टेंस (मैं इसे अब से रेड्यूसर कहता हूं)। प्रत्येक रेड्यूसर के साथ, विधि को कम करें 'कुंजी समूह' के आधार पर कई बार कहा जाता है। प्रत्येक समय को कम करने के लिए कहा जाता है, 'वैल्यूइन' में 'ग्रुपिंग तुलनित्र' में परिभाषित कुंजी द्वारा समूहित मानचित्र आउटपुट मानों की एक सूची होती है। डिफ़ॉल्ट रूप से, समूहीकरण समूह संपूर्ण मानचित्र आउटपुट कुंजी का उपयोग करता है ।

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

+0

क्या आप शब्द के गिनती के रूप में एक सरल उदाहरण लेते हुए, अपने परिदृश्य के साथ अपना उत्तर समझा सकते हैं। जो मैं खोज रहा हूं वह पूरी नौकरी का सिस्टम स्तर काम कर रहा है। यह भी एक संदेह है: क्या हम कुछ पैरामीटर पर एक रेड्यूसर में पारित की गई चाबियों को समूहित कर सकते हैं, इस मामले के लिए कहें: वर्ष 2013 –

1

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

public class SimplePartitioner implements Partitioner { 
@Override 
public int getPartition(Text compositeKey, LongWritable value, int numReduceTasks) { 
    //Split the key into natural and augment 
    String naturalKey = compositeKey.toString().split("separator") 


    return naturalKey.hashCode(); 
} 

}

और अब अगर आप चाहते हैं डेटा की एक विभाजन के भीतर सभी अपने प्रासंगिक पंक्तियों एक भी कम करने आप भी एक समूह तुलनित्र जो केवल प्राकृतिक कुंजी

समझता है को लागू करना चाहिए के लिए भेजा जाता
public class SimpleGroupingComparator extends WritableComparator { 

@Override 
public int compare(Text compositeKey1, Text compositeKey2) { 


return compare(compositeKey1.getNaturalKey(),compositeKey2.getNaturalKey()); 
} 

}

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