2012-04-11 23 views
13

क्या कोई नक्शा में औसत/मात्राओं की गणना को कम कर सकता है?मानचित्र में कंप्यूटिंग औसत

Datafu की औसत से मेरे समझ के साथ कि 'एन' मानचित्रकारों डेटा को सॉर्ट और करने के लिए "1" कम करने जो सभी n मानचित्रकारों से डेटा छंटाई और मंझला (मध्य मूल्य) की खोज के लिए जिम्मेदार है डेटा भेजने है क्या मेरी समझ सही है ?,

यदि ऐसा है, तो के लिए यह दृष्टिकोण पैमाने डेटा की भारी मात्रा में है क्योंकि मैं अंतिम कार्य करने के लिए संघर्ष कर रहे एक एकल reducer स्पष्ट रूप से देख सकता हूं। धन्यवाद

उत्तर

12

एक श्रृंखला में औसत (मध्य संख्या) को खोजने का प्रयास करने की आवश्यकता है कि 1 रेड्यूसर को 'मध्य' मान निर्धारित करने के लिए संख्याओं की पूरी श्रृंखला पारित की जा रही है।

आपके इनपुट सेट में मानों की सीमा और विशिष्टता के आधार पर, आप प्रत्येक मूल्य की आवृत्ति को आउटपुट करने के लिए एक संयोजक पेश कर सकते हैं - आपके एकल reducer को भेजे गए मानचित्र आउटपुट की संख्या को कम करना। तब आपका रेड्यूसर मध्यस्थ की पहचान करने के लिए क्रम मूल्य/आवृत्ति जोड़े का उपभोग कर सकता है।

एक और तरीका है कि आप (फिर अगर आप रेंज और मूल्यों के किसी न किसी वितरण जानते हैं) इस पैमाने पर हो सकता है कि सीमा बाल्टी द्वारा कुंजी वितरित करता है एक कस्टम विभाजक (0-99 कम करने के लिए 0, 100-199 कम करने के लिए जाने के उपयोग करने के लिए है 2, और इतने पर)। इसके लिए रेड्यूसर आउटपुट की जांच करने और अंतिम औसत गणना करने के लिए कुछ माध्यमिक नौकरी की आवश्यकता होगी (उदाहरण के लिए प्रत्येक रेड्यूसर में चाबियों की संख्या जानने के लिए, आप गणना कर सकते हैं कि कौन से रेड्यूसर आउटपुट में औसत होगा, और किस ऑफसेट पर)

2

हे ((एन लॉग एन)/पी) इसे क्रमबद्ध करने के लिए ओ (1) औसत प्राप्त करने के लिए।

हाँ ... आप ओ (एन/पी) प्राप्त कर सकते हैं लेकिन आप हडोप में बॉक्स सॉर्ट कार्यक्षमता के बाहर उपयोग नहीं कर सकते हैं। जब तक आप समानांतर केथ सबसे बड़े एल्गोरिदम को कोड करने के लिए 2-20 घंटे के विकास के समय को औचित्य साबित नहीं कर लेते हैं, तब तक मैं बस सॉर्ट करता हूं और केंद्र आइटम प्राप्त करता हूं।

7

क्या आपको वास्तव में सटीक औसत और क्वांटाइल की आवश्यकता है?

बहुत समय, आप अनुमानित मूल्य प्राप्त करने और उनके साथ काम करने के साथ बेहतर हैं, विशेष रूप से यदि आप इसका उपयोग उदाहरण के लिए करते हैं डेटा विभाजन

  1. प्रत्येक के लिए एक नक्शाकार है:

    वास्तव में, आप (O(n/p) समय में वास्तव में) सटीक quantiles खोजने तेजी लाने के लिए अनुमानित quantiles उपयोग कर सकते हैं, यहाँ रणनीति का एक मोटा रूपरेखा है विभाजन वांछित क्वांटाइल की गणना करें, और उन्हें एक नए डेटा सेट पर आउटपुट करें। यह डेटा सेट आवर्धन के कई क्रम होना चाहिए (जब तक कि आप बहुत अधिक मात्रा के लिए नहीं पूछते हैं!)

  2. इस डेटा सेट के भीतर, क्वांटाइल फिर से की गणना करें, "मध्यस्थों के मध्य" के समान। ये आपके शुरुआती अनुमान हैं।
  3. इन क्वांटाइल के अनुसार डेटा दोहराएं (या यहां तक ​​कि अतिरिक्त विभाजन भी इस तरह से प्राप्त किए गए हैं)। लक्ष्य यह है कि अंत में, वास्तविक मात्रा को एक विभाजन में होने की गारंटी दी जाती है, और प्रत्येक विभाजन
  4. प्रत्येक विभाजन में वांछित क्वांटाइल में से एक होना चाहिए, प्रत्येक विभाजन के भीतर, एक त्वरित चयन करें (O(n) में) सही मात्रा पाएं।

प्रत्येक चरण रैखिक समय में है। सबसे महंगा कदम भाग 3 है, क्योंकि इसे पूरे डेटा सेट को फिर से वितरित करने की आवश्यकता होगी, इसलिए यह O(n) नेटवर्क यातायात उत्पन्न करता है। आप पहले पुनरावृत्ति के लिए "वैकल्पिक" क्वांटाइल चुनकर प्रक्रिया को अनुकूलित कर सकते हैं। कहें, आप वैश्विक औसत खोजना चाहते हैं। आप इसे आसानी से रैखिक प्रक्रिया में नहीं ढूंढ सकते हैं, लेकिन संभवत: डेटा सेट के 1/kth तक को संकीर्ण कर सकते हैं, जब इसे के विभाजन में विभाजित किया जाता है। तो प्रत्येक नोड अपने मध्यस्थ की रिपोर्ट करने के बजाय, प्रत्येक नोड अतिरिक्त वस्तुओं (के -1)/(2k) और (के + 1)/(2k) पर वस्तुओं की रिपोर्ट करता है। इससे आपको मूल्यों की सीमा को कम करने की अनुमति मिलनी चाहिए जहां सही औसत हस्ताक्षर से झूठ बोलना चाहिए। तो अगले चरण में, आप प्रत्येक नोड उन वस्तुओं को भेज सकते हैं जो वांछित सीमा के भीतर एक मास्टर नोड में हैं, और केवल इस श्रेणी के भीतर औसत चुनें।

+0

प्रसंस्करण सटीक quantiles ढूँढना इस दृष्टिकोण एमी में बहुत महंगा हो सकता है अनुभवहीन दृष्टिकोण की तुलना में बेहतर है, हालांकि के साथ संघर्ष करना होगा । चरण 1 से 4 वास्तव में सेट को विभाजित करने में मदद करता है और एक छोटी सी जगह में एक ही समस्या को हल करता है। लेकिन इस दृष्टिकोण में, यह वास्तव में मात्रा प्राप्त करने के लिए चरण 4 से चरण 4 के लॉग इन पुनरावृत्तियों को ले सकता है। – Sourabh

0

कई वास्तविक दुनिया परिदृश्यों में, डेटासेट में मूल्यों की कार्डिनालिटी अपेक्षाकृत छोटी होगी। अपने डेटासेट में

  1. गणना मूल्यों की आवृत्तियों (शब्द गणना काम, मूल रूप से)
  2. पहचान नक्शाकार + एक कम करने जो मंझला की गणना करता है < मूल्य के आधार पर: ऐसे मामलों में, समस्या कुशलता से दो MapReduce नौकरियों के साथ हल किया जा सकता - आवृत्ति> जोड़े

नौकरी 1. डेटा की मात्रा को काफी कम कर देगा और समानांतर में पूरी तरह से निष्पादित किया जा सकता है। नौकरी के Reducer 2. केवल n (n = cardinality of your value set) सभी मूल्यों के बजाय वस्तुओं को निष्क्रिय दृष्टिकोण के साथ संसाधित करना होगा।

नीचे, नौकरी का एक उदाहरण reducer 2. यह पाइथन लिपि है जिसका उपयोग सीधे हडोप स्ट्रीमिंग में किया जा सकता है। मान लिया गया है अपने डेटासेट में मूल्यों ints हैं, लेकिन आसानी से इस उत्तर के लिए एक सुझाव शुरू में Chris White की answer से आ रही के शीर्ष पर बनाता है के लिए double रों

import sys 

item_to_index_range = [] 
total_count = 0 

# Store in memory a mapping of a value to the range of indexes it has in a sorted list of all values 
for line in sys.stdin: 
    item, count = line.strip().split("\t", 1) 
    new_total_count = total_count + int(count) 
    item_to_index_range.append((item, (total_count + 1, new_total_count + 1))) 
    total_count = new_total_count 

# Calculate index(es) of middle items 
middle_items_indexes = [(total_count/2) + 1] 
if total_count % 2 == 0: 
    middle_items_indexes += [total_count/2] 

# Retrieve middle item(s) 
middle_items = [] 
for i in middle_items_indexes: 
    for item, index_range in item_to_index_range: 
     if i in range(*index_range): 
      middle_items.append(item) 
      continue 

print sum(middle_items)/float(len(middle_items)) 

अपनाया जा सकता है। उत्तर मूल्यों की आवृत्तियों की गणना करने के लिए एक संयोजन के रूप में एक combiner का उपयोग करने का सुझाव देता है। हालांकि, MapReduce में, संयोजकों को हमेशा निष्पादित होने की गारंटी नहीं है। - आवृत्ति> जोड़े और फिर मंझला गणना

  • कम करने पहले फाइनल < मूल्य की गणना करना होगा: यह कुछ साइड इफेक्ट है।
  • सबसे खराब स्थिति में, समेलक मार डाला कभी नहीं किया जाएगा और कम करने अभी भी सभी व्यक्तिगत मूल्यों