MapReduce की सरल व्याख्या?


166

मेरे CouchDB प्रश्न से संबंधित ।

क्या कोई मैप कर सकता है?


4
यह सबसे अच्छा :) है http://ksat.me/map-reduce-a-really-simple-introduction-kloudo/
ibmkhd


@MichaelHausenblas - मुझे आपका उदाहरण पसंद है: समझने में आसान और पूरे परिवार के लिए मज़ेदार।
ली

जोएल स्पोलस्की ने शुरुआती लोगों के लिए एक अच्छी व्याख्या की है - joelonsoftware.com/items/2006/08/01.html
user2314737

जवाबों:


187

नक्शा और कमी के लिए मूल बातें करने के लिए नीचे सभी तरह जा रहे हैं।


मानचित्र एक ऐसा कार्य है जो वस्तुओं को किसी प्रकार की सूची में किसी अन्य प्रकार के आइटम में "रूपांतरित" करता है और उन्हें उसी प्रकार की सूची में वापस रखता है।

मान लें कि मेरे पास संख्याओं की एक सूची है: [1,2,3] और मैं हर संख्या को दोगुना करना चाहता हूं, इस मामले में, "हर संख्या को दोगुना करने" का कार्य फ़ंक्शन x = x * है 2. और बिना मैपिंग के, मैं लिख सकता था। एक साधारण पाश, कहते हैं

A = [1, 2, 3]
foreach (item in A) A[item] = A[item] * 2

और मेरे पास A = [2, 4, 6] होगा, लेकिन लूप लिखने के बजाय, अगर मेरे पास कोई मैप फंक्शन है तो मैं लिख सकता हूं

A = [1, 2, 3].Map(x => x * 2)

x => x * 2 एक फ़ंक्शन है जिसे तत्वों के खिलाफ निष्पादित किया जाना है [1,2,3]। क्या होता है कि कार्यक्रम प्रत्येक आइटम को लेता है, प्रत्येक आइटम के बराबर एक्स बनाकर उसके खिलाफ निष्पादित (x => x * 2) करें, और परिणामों की एक सूची तैयार करें।

1 : 1 => 1 * 2 : 2  
2 : 2 => 2 * 2 : 4  
3 : 3 => 3 * 2 : 6  

इसलिए (x => x * 2) के साथ मानचित्र फ़ंक्शन को निष्पादित करने के बाद आपके पास [2, 4, 6] होगा।


कम करना एक ऐसा कार्य है जो सूचियों में वस्तुओं को "एकत्रित" करता है और उन सभी पर कुछ गणना करता है, इस प्रकार उन्हें एक मूल्य पर कम करता है।

एक राशि का पता लगाना या औसत ढूँढना सभी एक कम फ़ंक्शन के उदाहरण हैं। जैसे कि अगर आपके पास संख्याओं की सूची है, तो [7, 8, 9] और आप चाहते हैं कि उन्हें सारांशित किया जाए, आप इस पर एक लूप लिखेंगे

A = [7, 8, 9]
sum = 0
foreach (item in A) sum = sum + A[item]

लेकिन, यदि आपके पास कम फ़ंक्शन तक पहुंच है, तो आप इसे इस तरह से लिख सकते हैं

A = [7, 8, 9]
sum = A.reduce( 0, (x, y) => x + y )

अब यह थोड़ा भ्रमित है कि 2 तर्क क्यों हैं (0 और x और y के साथ फ़ंक्शन) पास। उपयोगी होने के लिए एक कम फ़ंक्शन के लिए, यह 2 आइटम लेने में सक्षम होना चाहिए, कुछ की गणना करें और "कम" करें कि 2 आइटम केवल एक एकल मूल्य पर, इस प्रकार कार्यक्रम प्रत्येक जोड़ी को कम कर सकता है जब तक कि हमारे पास एक भी मूल्य न हो।

निष्पादन निम्नानुसार होगा:

result = 0
7 : result = result + 7 = 0 + 7 = 7
8 : result = result + 8 = 7 + 8 = 15
9 : result = result + 9 = 15 + 9 = 24

लेकिन आप हर समय शून्य से शुरू नहीं करना चाहते हैं, इसलिए पहला तर्क यह है कि आपको एक बीज मान विशेष रूप से पहली result =पंक्ति में मान निर्दिष्ट करने दें ।

आप 2 सूचियों का योग करना चाहते हैं, यह इस तरह दिख सकता है:

A = [7, 8, 9]
B = [1, 2, 3]
sum = 0
sum = A.reduce( sum, (x, y) => x + y )
sum = B.reduce( sum, (x, y) => x + y )

या एक ऐसा संस्करण जिसकी आपको वास्तविक दुनिया में अधिक संभावना है:

A = [7, 8, 9]
B = [1, 2, 3]

sum_func = (x, y) => x + y
sum = A.reduce( B.reduce( 0, sum_func ), sum_func )

DB सॉफ्टवेयर में इसकी एक अच्छी बात है क्योंकि, Map \ Reduce समर्थन के साथ आप डेटाबेस के साथ काम कर सकते हैं बिना यह जानने की जरूरत है कि इसका उपयोग करने के लिए डेटा को DB में कैसे संग्रहीत किया जाता है, यानी DB इंजन क्या है।

आपको बस उस इंजन को "बताने" में सक्षम करने की आवश्यकता है जिसे आप उन्हें मैप या रिड्यूस फ़ंक्शन के साथ आपूर्ति करके चाहते हैं और फिर डीबी इंजन डेटा के चारों ओर अपना रास्ता खोज सकता है, अपना फ़ंक्शन लागू कर सकता है, और परिणामों के साथ आ सकता है। आप सभी को जानना चाहते हैं कि यह कैसे सारे रिकॉर्डों को खो देता है।

अनुक्रमणिका और कुंजियाँ और जोड़ और दृश्य हैं और बहुत सारे सामान एक ही डेटाबेस को पकड़ सकता है, इसलिए डेटा को वास्तव में कैसे संग्रहीत किया जाता है, इसके खिलाफ परिरक्षण करके, आपके कोड को लिखना और बनाए रखना आसान हो जाता है।

समांतर प्रोग्रामिंग के लिए जाता है, यदि आप केवल यह निर्दिष्ट करते हैं कि आप वास्तव में लूपिंग कोड को लागू करने के बजाय डेटा के साथ क्या करना चाहते हैं, तो अंतर्निहित अवसंरचना "समानांतर" कर सकती है और आपके फ़ंक्शन को आपके लिए एक साथ समानांतर लूप में निष्पादित कर सकती है।


ठीक है, मैं नक्शा समझता हूं और व्यक्तिगत रूप से लिया गया कम करता हूं। लेकिन क्या अनुप्रयोगों मैं कम हो सकता है? एक Google परिदृश्य में वे इसका उपयोग उदाहरण के लिए कई मापदंडों की एक श्रृंखला के लिए करेंगे, जो उन्हें किसी दिए गए कीवर्ड के लिए पेज की रैंकिंग दें?
लोरेंजो

@lbolognini var कुल = ऑर्डर करता है ।um (o => o.UnitPrice * o.Quantity)
चक्री

जब आप लूपिंग की बहुत अवधारणा को अमूर्त करते हैं तो @lbolognini कई उपयोग हैं। Google के परिदृश्य में संभवतः उनके पास पेजरेंक, लिंक और व्हाट्सएप की गणना करने के लिए मशीनें हैं। जब वे कुछ और सर्वर जोड़ने की आवश्यकता होती है तो वे क्या करते हैं? हर एक लूपिंग कोड को संशोधित करना शायद एक विकल्प नहीं है। तो उन्होंने क्या किया कि वे इसके बजाय "कम करें" फ़ंक्शन के खिलाफ अपना गणना कोड लिखते हैं ... और जब सर्वर की सूची बदलती है, तो केवल "कम करें" फ़ंक्शन को बदलना होगा। समझ गया?
चक्री

औसत की गणना कैसे कम होगी? मैं जो देख रहा हूँ उससे आप अनुमान नहीं लगा सकते हैं? शायद अंश और हर को मैप करें और दोनों को समन के अंत में विभाजित करें?
एंडाइज़रवोनका

@arcticpenguin मैं वहां थोड़ा बहुत सामान्य हूं। वास्तव Average()में माना जाता है कि शीर्ष पर आइसिंग है Sum()। लेकिन मैंने इसके बारे में यह बताने के लिए बात की कि फ़ंक्शन को "घटाना" क्यों कहा जाता है ... एक औसत फ़ंक्शन एक ऐसी चीज़ है जो संख्याओं की एक सूची लेती है और इसे एक ही संख्या (जो औसत है) तक घटा देती है।
चक्र

60

MapReduce समानांतर में डेटा की विशाल मात्रा को संसाधित करने की एक विधि है जो डेवलपर को मैपर के अलावा किसी अन्य कोड को लिखने और कार्यों को कम करने की आवश्यकता नहीं है।

नक्शा समारोह एक परिणाम है, जो एक बाधा में आयोजित किया जाता है बाहर में डेटा और मथनी लेता है। यह फ़ंक्शन समान मानचित्र कार्य की एक बड़ी संख्या के साथ समानांतर में चल सकता है । तब डेटासेट को स्केलर मान तक घटाया जा सकता है ।

इसलिए यदि आप इसे SQL स्टेटमेंट की तरह समझते हैं

SELECT SUM(salary)
FROM employees
WHERE salary > 1000
GROUP by deptname

हम वेतन> 1000 के साथ कर्मचारियों के अपने सबसेट को प्राप्त करने के लिए मानचित्र का उपयोग कर सकते हैं जो मानचित्र समूह आकार की बाल्टी में बाधा का उत्सर्जन करता है।

उन समूहों में से प्रत्येक को कम करेगा। आपको अपना रिजल्ट सेट देते हुए।

सिर्फ गूगल पेपर के मेरे विश्वविद्यालय के अध्ययन नोट्स से यह लिखा है


33
  1. आंकड़ों का एक गुच्छा लें
  2. कुछ प्रकार के परिवर्तन करें जो हर डेटा को किसी अन्य प्रकार के डेटम में परिवर्तित करता है
  3. उन नए डेटा को अभी तक सरल डेटा में मिलाएं

चरण 2 नक्शा है। चरण 3 कम है।

उदाहरण के लिए,

  1. सड़क पर दबाव मीटर की एक जोड़ी पर दो आवेगों के बीच का समय प्राप्त करें
  2. मीटर की दूरी के आधार पर उन समय को गति में मैप करें
  3. उन गति को औसत गति से कम करें

MapReduce का कारण Map और Reduce के बीच विभाजित है, क्योंकि विभिन्न भागों को आसानी से समानांतर में किया जा सकता है। (विशेषकर यदि Reduce में कुछ गणितीय गुण हों।)

MapReduce के जटिल लेकिन अच्छे विवरण के लिए, देखें: Google का MapReduce Programming Model - Revisited (PDF)


1
मैं चरण 3 के लिए कहूंगा, "ट्रांसफ़ॉर्म" के बजाय "कंबाइन"
ट्रॉमापोनी

पहली बार, तीन उत्तर संयुक्त सर्वश्रेष्ठ उत्तर है। पहले नासिर के लेख लिंक (सैद्धांतिक उच्च-स्तर) को पढ़ें, फिर चक्रित का उत्तर (मानचित्र-कम करने का व्यक्तिगत विवरण) अब फ्रैंक का उत्तर (जो कि प्रसिद्ध MapReduce मुहावरा है।) आप तीनों का धन्यवाद। :)
अजीत गंगा

20

एमएपी और REDUCE पुराने लिस्प फ़ंक्शन हैं जब से आदमी ने आखिरी डायनासोर को मार डाला था।

कल्पना कीजिए कि आपके पास नाम के बारे में शहरों की एक सूची है, वहां रहने वाले लोगों की संख्या और शहर का आकार:

(defparameter *cities*
  '((a :people 100000 :size 200)
    (b :people 200000 :size 300)
    (c :people 150000 :size 210)))

अब आप उच्चतम जनसंख्या घनत्व वाले शहर को ढूंढना चाह सकते हैं।

पहले हम MAP का उपयोग करके शहर के नाम और जनसंख्या घनत्व की एक सूची बनाते हैं:

(map 'list
     (lambda (city)
         (list (first city)
               (/ (getf (rest city) :people)
                  (getf (rest city) :size))))
     *cities*)

=>   ((A 500) (B 2000/3) (C 5000/7))

REDUCE के उपयोग से हम अब शहर को सबसे बड़ी जनसंख्या घनत्व के साथ पा सकते हैं।

(reduce (lambda (a b)
          (if (> (second a) (second b))
             a
             b))
        '((A 500) (B 2000/3) (C 5000/7)))

 =>   (C 5000/7)

दोनों भागों को मिलाकर हमें निम्नलिखित कोड मिलते हैं:

(reduce (lambda (a b)
          (if (> (second a) (second b))
             a
             b))
        (map 'list
             (lambda (city)
                (list (first city)
                   (/ (getf (rest city) :people)
                      (getf (rest city) :size))))
             *cities*))

आइए कार्य शुरू करें:

(defun density (city)
   (list (first city)
         (/ (getf (rest city) :people)
            (getf (rest city) :size))))

(defun max-density (a b)
   (if (> (second a) (second b))
          a
          b))

तब हम अपना MAP REDUCE कोड इस प्रकार लिख सकते हैं:

(reduce 'max-density
        (map 'list 'density *cities*))

 =>   (C 5000/7)

यह कॉल करता है MAPऔर REDUCE(मूल्यांकन अंदर है), इसलिए इसे मैप कम कहा जाता है ।


@MMolog: फ़ंक्शन MAX पहले से मौजूद है और कुछ अलग करता है। इसके अलावा: किसी को MAX को फिर से परिभाषित नहीं करना चाहिए।
रेनर जोसविग

max-densityपारित आर्ग के दूसरे तत्व की तुलना करता है , है ना? मूर्खतापूर्ण संपादन के लिए क्षमा करें।
अलेक्जेंडर प्रेबर

@MMolog: हाँ, यह दूसरा तत्व है और यह केवल इस छोटे से उदाहरण के संदर्भ में उपयोगी है। कोड भी उद्देश्य पर थोड़ा पुराने शैली लिस्प में लिखा है, जिसमें डेटा संरचनाएं हैं ...
रेनर जोसविग

17

Google पेपर से उदाहरण लेते हैं । MapReduce का लक्ष्य कुछ प्रकार के एल्गोरिदम के लिए समानताओं में काम करने वाली प्रसंस्करण इकाइयों के भार का कुशलतापूर्वक उपयोग करने में सक्षम होना है। छूट निम्नलिखित है: आप दस्तावेजों के एक सेट में सभी शब्दों और उनकी गिनती निकालना चाहते हैं।

विशिष्ट कार्यान्वयन:

for each document
    for each word in the document
        get the counter associated to the word for the document
        increment that counter 
    end for
end for

MapReduce कार्यान्वयन:

Map phase (input: document key, document)
for each word in the document
    emit an event with the word as the key and the value "1"
end for

Reduce phase (input: key (a word), an iterator going through the emitted values)
for each value in the iterator
    sum up the value in a counter
end for

उसके आस-पास, आपके पास एक मास्टर प्रोग्राम होगा जो "स्प्लिट्स" में दस्तावेज़ों के सेट को विभाजित करेगा, जिसे मैप चरण के लिए समानांतर में संभाला जाएगा। उत्सर्जित मान कार्यकर्ता द्वारा श्रमिक के लिए एक बफर में लिखे गए हैं। मास्टर कार्यक्रम तब अन्य श्रमिकों को प्रतिनिधि बनाता है जैसे ही यह सूचित किया जाता है कि बफर चरण को संभालने के लिए तैयार है।

प्रत्येक श्रमिक आउटपुट (एक मानचित्र या एक छोटा कर्मचारी होने के नाते) वास्तव में वितरित फ़ाइल सिस्टम (Google के लिए GFS) या CouchDB के लिए वितरित डेटाबेस में संग्रहीत फ़ाइल है।


10

MapReduce के लिए वास्तव में आसान , त्वरित और "डमीज़ के लिए" परिचय यहां उपलब्ध है: http://www.marcolotz.com/?p/67

इसकी कुछ सामग्री पोस्ट करना:

सबसे पहले, MapReduce मूल रूप से क्यों बनाया गया था?

मूल रूप से Google को बड़ी कम्प्यूटेशन नौकरियों को आसानी से समानांतर बनाने के लिए एक समाधान की आवश्यकता थी, जिससे नेटवर्क के माध्यम से जुड़ी कई मशीनों में डेटा वितरित किया जा सके। इसके अलावा, इसे पारदर्शी तरीके से मशीन की विफलता को संभालना था और लोड संतुलन मुद्दों का प्रबंधन करना था।

MapReduce असली ताकत क्या हैं?

कोई कह सकता है कि MapReduce का जादू Map और Reduce फ़ंक्शन अनुप्रयोग पर आधारित है। मुझे साथी को स्वीकार करना चाहिए, कि मैं दृढ़ता से असहमत हूं। मुख्य विशेषता जिसने MapReduce को इतना लोकप्रिय बना दिया, वह सरल इंटरफ़ेस के साथ मिलकर, स्वचालित समानांतरकरण और वितरण की क्षमता है। इन कारकों में से अधिकांश के लिए पारदर्शी विफलता हैंडलिंग के साथ अभिव्यक्त किया गया, इस ढांचे को इतना लोकप्रिय बना दिया।

कागज पर थोड़ी और गहराई:

MapReduce को मूल रूप से एक समरूप दृष्टिकोण और कमोडिटी-कंप्यूटर क्लस्टर का उपयोग करके बिग डेटा में संगणना बनाने के लिए एक समाधान के रूप में Google पेपर (डीन और गेमावत, 2004 - लिंक यहाँ) में उल्लेख किया गया था। Hadoop के विपरीत, जो जावा में लिखा गया है, Google की रूपरेखा C ++ में लिखी गई है। दस्तावेज़ का वर्णन है कि बड़े डेटा सेट पर कार्यात्मक प्रोग्रामिंग से मैप और रिड्यूस फ़ंक्शन का उपयोग करके एक समानांतर फ्रेमवर्क कैसे व्यवहार करेगा।

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

इस आवेदन के लिए छद्म कोड, बोला गया है:

map(String key, String value):

// key: document name
// value: document contents
for each word w in value:
EmitIntermediate(w, “1”);

reduce(String key, Iterator values):

// key: a word
// values: a list of counts
int result = 0;
for each v in values:
    result += ParseInt(v);
Emit(AsString(result));

जैसा कि एक नोटिस कर सकता है, नक्शा एक रिकॉर्ड में सभी शब्दों को पढ़ता है (इस मामले में एक रिकॉर्ड एक पंक्ति हो सकती है) और मूल्य के रूप में शब्द को कुंजी और नंबर 1 के रूप में उत्सर्जित करता है। बाद में, कम एक ही कुंजी के सभी मूल्यों को समूहित करेगा। आइए एक उदाहरण दें: कल्पना करें कि रिकॉर्ड में 'घर' शब्द तीन बार दिखाई देता है। रिड्यूसर का इनपुट [हाउस, [1,1,1]] होगा। Reducer में, यह कुंजी हाउस के लिए सभी मानों को सम्‍मिलित करेगा और आउटपुट के रूप में निम्‍नलिखित प्रमुख मान देगा: [house, [3]]।

यहाँ एक छवि है कि यह MapReduce ढांचे में कैसा दिखेगा:

मूल MapReduce Google पेपर से छवि

MapReduce अनुप्रयोगों के कुछ अन्य शास्त्रीय उदाहरणों के रूप में, कोई कह सकता है:

• URL पहुंच आवृत्ति की गणना

• वेब-लिंक ग्राफ को उलट दें

• वितरित ग्रेप

• मेजबान प्रति शब्द वेक्टर

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

दस्तावेज़ यह भी बताता है कि दोष के मामले में ढांचे के तत्वों को कैसे व्यवहार करना चाहिए। कागज में इन तत्वों को कार्यकर्ता और मास्टर कहा जाता है। उन्हें ओपन-सोर्स कार्यान्वयन में अधिक विशिष्ट तत्वों में विभाजित किया जाएगा। चूंकि Google ने केवल पेपर में दृष्टिकोण का वर्णन किया है और अपने स्वामित्व सॉफ्टवेयर को जारी नहीं किया है, इसलिए मॉडल को लागू करने के लिए कई ओपन-सोर्स फ्रेमवर्क बनाए गए थे। उदाहरण के तौर पर कोई कह सकता है कि मानदो में Hadoop या सीमित MapReduce फीचर है।

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

प्रमुख धारणाएँ:

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

स्थानीयता: नेटवर्क ट्रैफ़िक से बचने के लिए, ढांचा यह सुनिश्चित करने की कोशिश करता है कि सभी इनपुट डेटा स्थानीय रूप से उन मशीनों के लिए उपलब्ध हैं जो उन पर कम्प्यूटेशन करने जा रहे हैं। मूल विवरण में, यह Google फ़ाइल सिस्टम (GFS) का उपयोग प्रतिकृति कारक 3 और 64 एमबी के ब्लॉक आकार के साथ करता है। इसका मतलब यह है कि 64 एमबी (कि फाइल सिस्टम में एक फ़ाइल की रचना) के एक ही ब्लॉक में तीन अलग-अलग मशीनों में समान प्रतियां होंगी। मास्टर को पता है कि ब्लॉक कहां हैं और उस मशीन में मानचित्र नौकरियों को शेड्यूल करने का प्रयास करें। यदि वह विफल हो जाता है, तो मास्टर कार्यों के डेटा की प्रतिकृति के पास एक मशीन आवंटित करने की कोशिश करता है (यानी डेटा मशीन के एक ही रैक में एक कार्यकर्ता मशीन)।

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

बैकअप कार्य: कभी-कभी, एक नक्शा या Reducer कार्यकर्ता क्लस्टर में दूसरों की तुलना में बहुत अधिक धीमी गति से व्यवहार कर सकता है। यह कुल प्रसंस्करण समय पकड़ सकता है और इसे उस एकल धीमी मशीन के प्रसंस्करण समय के बराबर बना सकता है। मूल पेपर बैकअप टास्क नामक एक विकल्प का वर्णन करता है, जो मास्टर द्वारा निर्धारित किया जाता है जब एक MapReduce ऑपरेशन पूरा होने के करीब होता है। ये ऐसे कार्य हैं जो इन-प्रगति कार्यों के मास्टर द्वारा निर्धारित किए गए हैं। इस प्रकार, MapReduce कार्रवाई तब पूर्ण होती है जब प्राथमिक या बैकअप समाप्त हो जाता है।

काउंटरर्स: कभी-कभी किसी को ईवेंट्स की गणना करने की इच्छा हो सकती है। इस कारण से, जहाँ बनाया जाता है। प्रत्येक श्रमिकों में काउंटर मूल्यों को समय-समय पर मास्टर के लिए प्रचारित किया जाता है। मास्टर तब एकत्र करता है (Yep। लगता है कि प्रागेल एग्रीगेटर्स इसी जगह से आए थे) एक सफल मानचित्र के काउंटर मान और टास्क को कम करते हैं और उन्हें उपयोगकर्ता कोड में वापस कर देते हैं जब MapReduce ऑपरेशन पूरा होता है। मास्टर स्टेटस में एक मौजूदा काउंटर वैल्यू भी उपलब्ध है, इसलिए प्रक्रिया को देखने वाला एक इंसान इस बात पर नज़र रख सकता है कि वह कैसा व्यवहार कर रहा है।

ठीक है, मुझे लगता है कि उपरोक्त सभी अवधारणाओं के साथ, Hadoop आपके लिए केक का एक टुकड़ा होगा। यदि आपके पास मूल MapReduce लेख या संबंधित कुछ के बारे में कोई प्रश्न है, तो कृपया मुझे बताएं।


4

मैं ट्राइट ध्वनि नहीं करना चाहता, लेकिन इससे मुझे बहुत मदद मिली, और यह बहुत आसान है:

cat input | map | reduce > output

4

यदि आप पायथन से परिचित हैं, तो MapReduce की सबसे सरल संभव व्याख्या निम्नलिखित है:

In [2]: data = [1, 2, 3, 4, 5, 6]
In [3]: mapped_result = map(lambda x: x*2, data)

In [4]: mapped_result
Out[4]: [2, 4, 6, 8, 10, 12]

In [10]: final_result = reduce(lambda x, y: x+y, mapped_result)

In [11]: final_result
Out[11]: 42

देखें कि कच्चे डेटा के प्रत्येक खंड को व्यक्तिगत रूप से कैसे संसाधित किया गया था, इस मामले में, 2 से गुणा ( MapReduce का नक्शा भाग)। के आधार पर mapped_result, हमने निष्कर्ष निकाला कि परिणाम 42( MapReduce का कम हिस्सा) होगा।

इस उदाहरण से एक महत्वपूर्ण निष्कर्ष यह तथ्य है कि प्रसंस्करण का प्रत्येक हिस्सा किसी अन्य chunk पर निर्भर नहीं करता है। उदाहरण के लिए, यदि thread_1मानचित्र [1, 2, 3], और thread_2मानचित्र [4, 5, 6], दोनों थ्रेड्स का अंतिम परिणाम अभी भी होगा, [2, 4, 6, 8, 10, 12]लेकिन हमने इसके लिए प्रसंस्करण समय को आधा कर दिया है। कम किए गए ऑपरेशन के लिए भी यही कहा जा सकता है और इसका सार यह है कि मैपआरड्यूस समानांतर कंप्यूटिंग में कैसे काम करता है।

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