Hadoop MapReduce जॉइन और काउंटर उदाहरण के साथ

⚡ स्मार्ट सारांश

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

  • 🔘 जुड़ने की बुनियादी बातें: दोनों डेटासेट में से छोटा वाला डेटासेट प्रत्येक डेटा नोड में वितरित किया जाता है और लुकअप साइड के रूप में उपयोग किया जाता है।
  • मैप-साइड जॉइन: मैप फ़ंक्शन के चलने से पहले प्रत्येक इनपुट को विभाजित करना, समान रूप से बांटना और जॉइन कुंजी के आधार पर क्रमबद्ध करना आवश्यक है।
  • रिड्यूस-साइड जॉइन: इसमें विभाजन की आवश्यकता नहीं है, क्योंकि एक ही कुंजी साझा करने वाला प्रत्येक टपल एक ही रिड्यूसर में आता है।
  • 🧪 उदाहरण सहित: DeptName.txt और DeptStrength.txt को HDFS में कॉपी किया जाता है और एक पैकेजित जार फ़ाइल द्वारा Dept_ID पर जोड़ा जाता है।
  • काउंटर के प्रकार: प्रत्येक जॉब के साथ पाँच अंतर्निर्मित काउंटर समूह आते हैं, और उपयोगकर्ता-परिभाषित काउंटरों को घोषित किया जाता है। Java एनम.
  • ⚠️ प्रतिकार का उपयोग: प्रत्येक गुम या अमान्य रिकॉर्ड पर काउंटर बढ़ाने से डेटा-गुणवत्ता संबंधी समस्याएं जॉब रिपोर्ट पर एक संख्या के रूप में दर्ज हो जाती हैं।

एक उदाहरण सहित हैडूप मैप रिड्यूस जॉइन और काउंटर ट्यूटोरियल

मैप रिड्यूस में जॉइन क्या होता है?

मैप रिड्यूस जॉइन ऑपरेशन का उपयोग दो बड़े डेटासेट को संयोजित करने के लिए किया जाता है। हालांकि, इस प्रक्रिया में वास्तविक जॉइन ऑपरेशन करने के लिए बहुत सारा कोड लिखना पड़ता है। दो डेटासेट को जोड़ने की शुरुआत प्रत्येक डेटासेट के आकार की तुलना करके की जाती है। यदि एक डेटासेट दूसरे की तुलना में छोटा है, तो छोटे डेटासेट को क्लस्टर के प्रत्येक डेटा नोड में वितरित किया जाता है।

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

जुड़ने के प्रकार

हैडूप में जॉइन को दो प्रकारों में वर्गीकृत किया जाता है, यह इस बात पर निर्भर करता है कि वास्तविक जॉइन कहाँ किया जाता है।

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

हाडोप में जॉइन्स की समग्र प्रक्रिया प्रवाह को नीचे दिए गए चित्र में दर्शाया गया है।

Hadoop में मैप-साइड जॉइन और रिड्यूस-साइड जॉइन की तुलना करने वाला प्रोसेस फ्लो डायग्राम
Hadoop MapReduce में जॉइन के प्रकार

दोनों प्रकार स्पष्ट हो जाने के बाद, अगला खंड दो छोटी विभागीय फाइलों पर रिड्यूस-साइड जॉइन की प्रक्रिया को समझाता है।

दो डेटासेट को कैसे जोड़ें: मैपरेड्यूस उदाहरण

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

पहली इनपुट फ़ाइल में विभाग के नामों के साथ-साथ विभाग आईडी भी सूचीबद्ध हैं।

फ़ाइल 1
दूसरी इनपुट फ़ाइल में विभाग आईडी और विभाग की संख्या के मान सूचीबद्ध हैं।

फ़ाइल 2

इनपुट: इनपुट डेटा सेट दो txt फ़ाइलें हैं: DeptName.txt और DeptStrength.txt

इनपुट फ़ाइलें यहाँ से डाउनलोड करें

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

su - hduser_

प्रॉम्प्ट बदलकर हैडूप अकाउंट में बदल जाता है, जैसा कि नीचे दिखाया गया है।

su कमांड का उपयोग करके hduser खाते पर स्विच करने के बाद टर्मिनल

चरण 1) ज़िप फ़ाइल को अपनी पसंद के स्थान पर कॉपी करें

डाउनलोड की गई MapReduceJoin आर्काइव फ़ाइल को चुनी गई वर्किंग डायरेक्टरी में रखा गया है।

चरण 2) ज़िप फ़ाइल को अनकंप्रेस करें

sudo tar -xvf MapReduceJoin.tar.gz

भूतपूर्वtracटार द्वारा आर्काइव को अनपैक करते समय, फ़ाइल नामों को स्क्रॉल करके दिखाया जाता है।

फ़ाइलों की कंसोल सूची extracMapReduceJoin.tar.gz से लिया गया

चरण 3) निर्देशिका MapReduceJoin/ पर जाएं

cd MapReduceJoin/

MapReduceJoin डायरेक्टरी में जाने के बाद शेल प्रॉम्प्ट

चरण 4) Hadoop प्रारंभ करें

$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh

दोनों स्क्रिप्ट उन डेमन्स को प्रिंट करती हैं जिन्हें वे शुरू करती हैं।

HDFS और YARN डेमॉन स्क्रिप्ट से स्टार्टअप संदेश

चरण 5) DeptStrength.txt और DeptName.txt इस MapReduce Join उदाहरण प्रोग्राम के लिए प्रयुक्त इनपुट फ़ाइलें हैं।

इन फाइलों को कॉपी करने की आवश्यकता है एचडीएफएस नीचे दिए गए कमांड का उपयोग करके-

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal DeptStrength.txt DeptName.txt /

दोनों इनपुट टेक्स्ट फ़ाइलें HDFS रूट डायरेक्टरी में कॉपी हो गईं

चरण 6) नीचे दिए गए आदेश का उपयोग करके प्रोग्राम चलाएं-

$HADOOP_HOME/bin/hadoop jar MapReduceJoin.jar MapReduceJoin/JoinDriver/DeptStrength.txt /DeptName.txt /output_mapreducejoin

सबसे पहले कमांड को इको किया जाता है, और फिर जॉब कंसोल पर अपनी प्रगति की रिपोर्ट करती है।

पैकेजित MapReduceJoin jar फ़ाइल को लॉन्च करने के लिए कमांड लाइन

कंसोल आउटपुट tracमैप रिड्यूस जॉइन जॉब की प्रगति पर नज़र रखें

चरण 7) निष्पादन के बाद, आउटपुट फ़ाइल (जिसका नाम 'part-00000' है) HDFS पर /output_mapreducejoin निर्देशिका में संग्रहीत की जाएगी।

परिणाम कमांड लाइन इंटरफ़ेस का उपयोग करके देखे जा सकते हैं

$HADOOP_HOME/bin/hdfs dfs -cat /output_mapreducejoin/part-00000

कैट कमांड द्वारा एचडीएफएस से मुद्रित संयुक्त विभाग के रिकॉर्ड

परिणाम वेब इंटरफेस के माध्यम से भी देखे जा सकते हैं-

हैडूप वेब इंटरफेस का लैंडिंग पेज, जिसका उपयोग फाइल सिस्टम ब्राउज़र तक पहुंचने के लिए किया जाता है।

अब 'फ़ाइल सिस्टम ब्राउज़ करें' चुनें और /output_mapreducejoin तक जाएं।

HDFS फ़ाइल सिस्टम व्यू को आउटपुट_मैप रिड्यूस जॉइन डायरेक्टरी में ब्राउज़ करना

भाग खोलें-आर-00000

ब्राउज़र दृश्य के भीतर part-r-00000 आउटपुट फ़ाइल का चयन करना

परिणाम दिखाए गए हैं

ब्राउज़र में शामिल हुए विभाग का नाम और विभाग की संख्या वाली पंक्तियाँ प्रदर्शित होती हैं।

नोट: कृपया ध्यान दें कि इस प्रोग्राम को अगली बार चलाने से पहले, आपको आउटपुट निर्देशिका /output_mapreducejoin को हटाना होगा

$HADOOP_HOME/bin/hdfs dfs -rm -r /output_mapreducejoin

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

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

मैपरेड्यूस में काउंटर क्या है?

मैप रिड्यूस में काउंटर एक ऐसा तंत्र है जिसका उपयोग मैप रिड्यूस जॉब्स और इवेंट्स के बारे में सांख्यिकीय जानकारी एकत्र करने और मापने के लिए किया जाता है। काउंटर मैप रिड्यूस जॉब्स और इवेंट्स के बारे में सांख्यिकीय जानकारी को रिकॉर्ड करते हैं। tracMapReduce में विभिन्न कार्य सांख्यिकी जैसे कि संपन्न संक्रियाओं की संख्या और संक्रिया की प्रगति को मापने के लिए काउंटरों का उपयोग किया जाता है। MapReduce में समस्या निदान के लिए काउंटरों का उपयोग किया जाता है।

हाडोप काउंटर मैप या रिड्यूस के लिए कोड में लॉग संदेश डालने के समान हैं। यह जानकारी मैपरिड्यूस जॉब प्रोसेसिंग में किसी समस्या के निदान के लिए उपयोगी हो सकती है।

आमतौर पर, हैडूप में ये काउंटर किसी प्रोग्राम (मैप या रिड्यूस) में परिभाषित किए जाते हैं और किसी विशेष घटना या स्थिति (जो उस काउंटर से संबंधित हो) के घटित होने पर निष्पादन के दौरान बढ़ाए जाते हैं। हैडूप काउंटरों का एक बहुत अच्छा अनुप्रयोग यह है कि... tracइनपुट डेटासेट से k वैध और अवैध रिकॉर्ड।

मैपरिड्यूस काउंटर के प्रकार

मैप रिड्यूस काउंटर मूल रूप से दो प्रकार के होते हैं।

  1. Hadoop के अंतर्निर्मित काउंटर: कुछ अंतर्निहित Hadoop काउंटर हैं जो प्रत्येक जॉब के लिए मौजूद हैं। नीचे अंतर्निहित काउंटर समूह दिए गए हैं-
    • मैपरिड्यूस टास्क काउंटर — यह अपने निष्पादन समय के दौरान कार्य-विशिष्ट जानकारी (जैसे, इनपुट रिकॉर्ड की संख्या) एकत्र करता है।
    • फ़ाइल सिस्टम काउंटर — यह किसी कार्य द्वारा पढ़े या लिखे गए बाइट्स की संख्या जैसी जानकारी एकत्र करता है।
    • फ़ाइलइनपुटफ़ॉर्मेट काउंटर — FileInputFormat के माध्यम से पढ़े गए बाइट्स की संख्या की जानकारी एकत्र करता है।
    • फ़ाइलआउटपुटफ़ॉर्मेट काउंटर — FileOutputFormat के माध्यम से लिखे गए बाइट्स की संख्या की जानकारी एकत्र करता है।
    • नौकरी काउंटर — ये काउंटर किसी कार्य के लिए शुरू किए गए कार्यों की संख्या जैसे कार्य-व्यापी आँकड़े दर्ज करते हैं।
  2. उपयोगकर्ता द्वारा परिभाषित काउंटर: अंतर्निर्मित काउंटरों के अलावा, उपयोगकर्ता प्रोग्रामिंग भाषाओं द्वारा प्रदान की गई समान कार्यक्षमताओं का उपयोग करके अपने स्वयं के काउंटर परिभाषित कर सकता है। उदाहरण के लिए, Java'enum' का उपयोग उपयोगकर्ता द्वारा परिभाषित काउंटरों को परिभाषित करने के लिए किया जाता है।

💡 संस्करण संबंधी टिप्पणी: जॉब काउंटर का रखरखाव जॉब द्वारा किया जाता था।TracMRv1 के अंतर्गत ker। YARN पर वह भूमिका MapReduce ApplicationMaster की होती है, इसलिए काउंटर के नाम तो बने रहते हैं लेकिन उन्हें रिपोर्ट करने वाला घटक बदल गया है।

एक जॉब असीमित संख्या में काउंटर घोषित नहीं कर सकती। mapreduce.job.counters.max यह सेटिंग डिफ़ॉल्ट रूप से प्रति जॉब कुल संख्या को 120 तक सीमित करती है, और इससे अधिक जॉब घोषित करने पर विफलता का संकेत मिलता है। LimitExceededExceptionइसलिए काउंटर का उद्देश्य प्रति-कुंजी गणना के बजाय कुछ चुनिंदा समग्र संकेतों के लिए होता है।

काउंटर उदाहरण

इस ट्यूटोरियल में उपयोग की गई इनपुट डेटा फ़ाइल एक CSV फ़ाइल है, जिसका नाम SalesJan2009.csv है। इसमें एक उदाहरण MapClass दिया गया है जिसमें अनुपलब्ध और अमान्य मानों की गणना करने के लिए काउंटर शामिल हैं।

public static class MapClass
            extends MapReduceBase
            implements Mapper<LongWritable, Text, Text, Text>
{
    static enum SalesCounters { MISSING, INVALID };
    public void map ( LongWritable key, Text value,
                 OutputCollector<Text, Text> output,
                 Reporter reporter) throws IOException
    {
        
        //Input string is split using ',' and stored in 'fields' array
        String fields[] = value.toString().split(",", -20);
        //Value at 4th index is country. It is stored in 'country' variable
        String country = fields[4];
        
        //Value at 8th index is sales data. It is stored in 'sales' variable
        String sales = fields[8];
      
        if (country.length() == 0) {
            reporter.incrCounter(SalesCounters.MISSING, 1);
        } else if (sales.startsWith("\"")) {
            reporter.incrCounter(SalesCounters.INVALID, 1);
        } else {
            output.collect(new Text(country), new Text(sales + ",1"));
        }
    }
}

उपरोक्त कोड स्निपेट हैडूप मैप रिड्यूस में काउंटरों के एक उदाहरण कार्यान्वयन को दर्शाता है।

यहाँ, बिक्री काउंटर क्या काउंटर को ' का उपयोग करके परिभाषित किया गया है?एनमइसका उपयोग गुम और अमान्य इनपुट रिकॉर्ड की गणना करने के लिए किया जाता है।

कोड स्निपेट में, यदि 'देशयदि 'फ़ील्ड की लंबाई शून्य है तो उसका मान अनुपस्थित है और इसलिए संबंधित काउंटर SalesCounters.MISSING को बढ़ाया जाता है।

इसके बाद, यदि 'विक्रययदि ' फ़ील्ड की शुरुआत " से होती है, तो रिकॉर्ड को अमान्य माना जाता है। यह SalesCounters.INVALID काउंटर को बढ़ाकर दर्शाया जाता है।

💡 एपीआई नोट: ऊपर दिए गए अंश में मूल का उपयोग किया गया है। org.apache.hadoop.mapred एपीआई, जहां MapReduceBase, Mapper इंटरफेस, OutputCollector और Reporter अलग-अलग दिखाई देते हैं। वर्तमान कोड इसके विरुद्ध लिखा गया है। org.apache.hadoop.mapreduceजहां एक Context यह कलेक्टर और रिपोर्टर को बदल देता है, और एक काउंटर को बढ़ाया जाता है। context.getCounter(SalesCounters.MISSING).increment(1)दोनों में प्रतिवाद की अवधारणा एक समान है।

अक्सर पूछे जाने वाले प्रश्न

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

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

कोपायलट संभावित मैपर और रिड्यूसर स्केलेटन तैयार करता है, लेकिन यह एक ही क्लास में पुराने मैपरेड पैकेज और नए मैप रिड्यूस पैकेज को बेतरतीब ढंग से मिला देता है, जिससे कंपाइलिंग संभव नहीं होती। लॉजिक पर भरोसा करने से पहले इंपोर्ट और मेथड सिग्नेचर को ठीक कर लें।

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

जब कार्य पूरा हो जाता है तो वे कंसोल सारांश में मुद्रित होते हैं, कार्य इतिहास और संसाधन प्रबंधक वेब पेजों में प्रदर्शित होते हैं, और कार्य ऑब्जेक्ट से प्रोग्रामेटिक रूप से पठनीय होते हैं, ताकि एक ड्राइवर उन पर दावा कर सके और खराब रन को विफल कर सके।

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

अधिकांश रिपोर्टिंग कार्यों के लिए, नहीं। HiveQL जॉइन कुछ ही पंक्तियों में यह उसी शफल-एंड-मर्ज पैटर्न में संकलित हो जाता है। जब मर्ज लॉजिक SQL क्लॉज़ में फिट नहीं होता है, तो हाथ से लिखे गए कोड का उपयोग करना बेहतर होता है।

Hadoop पहले से मौजूद आउटपुट डायरेक्टरी में लिखने से मना कर देता है, जिससे तैयार परिणामों को ओवरराइट होने से बचाया जा सके। पहले डायरेक्टरी को रिकर्सिवली डिलीट करें, या अगली बार चलाने पर कोई दूसरा आउटपुट पाथ दें।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: