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

दोनों प्रकार स्पष्ट हो जाने के बाद, अगला खंड दो छोटी विभागीय फाइलों पर रिड्यूस-साइड जॉइन की प्रक्रिया को समझाता है।
दो डेटासेट को कैसे जोड़ें: मैपरेड्यूस उदाहरण
नीचे दिखाए गए अनुसार, दो अलग-अलग फ़ाइलों में डेटा के दो सेट हैं। दोनों फ़ाइलों में Dept_ID कुंजी समान है। हमारा लक्ष्य मैप रिड्यूस जॉइन का उपयोग करके इन फ़ाइलों को संयोजित करना है।
इनपुट: इनपुट डेटा सेट दो txt फ़ाइलें हैं: DeptName.txt और DeptStrength.txt
इनपुट फ़ाइलें यहाँ से डाउनलोड करें
सुनिश्चित करें कि आपके पास है Hadoop इंस्टॉल हो गया है। मैप रिड्यूस जॉइन उदाहरण की वास्तविक प्रक्रिया शुरू करने से पहले, उपयोगकर्ता को 'hduser' में बदलें (यह आईडी हैडूप कॉन्फ़िगरेशन के दौरान उपयोग की गई थी, आप इसे अपनी हैडूप कॉन्फ़िगरेशन के दौरान उपयोग की गई उपयोगकर्ता आईडी में बदल सकते हैं)।
su - hduser_
प्रॉम्प्ट बदलकर हैडूप अकाउंट में बदल जाता है, जैसा कि नीचे दिखाया गया है।
चरण 1) ज़िप फ़ाइल को अपनी पसंद के स्थान पर कॉपी करें
चरण 2) ज़िप फ़ाइल को अनकंप्रेस करें
sudo tar -xvf MapReduceJoin.tar.gz
भूतपूर्वtracटार द्वारा आर्काइव को अनपैक करते समय, फ़ाइल नामों को स्क्रॉल करके दिखाया जाता है।
चरण 3) निर्देशिका MapReduceJoin/ पर जाएं
cd MapReduceJoin/
चरण 4) Hadoop प्रारंभ करें
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
दोनों स्क्रिप्ट उन डेमन्स को प्रिंट करती हैं जिन्हें वे शुरू करती हैं।
चरण 5) DeptStrength.txt और DeptName.txt इस MapReduce Join उदाहरण प्रोग्राम के लिए प्रयुक्त इनपुट फ़ाइलें हैं।
इन फाइलों को कॉपी करने की आवश्यकता है एचडीएफएस नीचे दिए गए कमांड का उपयोग करके-
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal DeptStrength.txt DeptName.txt /
चरण 6) नीचे दिए गए आदेश का उपयोग करके प्रोग्राम चलाएं-
$HADOOP_HOME/bin/hadoop jar MapReduceJoin.jar MapReduceJoin/JoinDriver/DeptStrength.txt /DeptName.txt /output_mapreducejoin
सबसे पहले कमांड को इको किया जाता है, और फिर जॉब कंसोल पर अपनी प्रगति की रिपोर्ट करती है।
चरण 7) निष्पादन के बाद, आउटपुट फ़ाइल (जिसका नाम 'part-00000' है) HDFS पर /output_mapreducejoin निर्देशिका में संग्रहीत की जाएगी।
परिणाम कमांड लाइन इंटरफ़ेस का उपयोग करके देखे जा सकते हैं
$HADOOP_HOME/bin/hdfs dfs -cat /output_mapreducejoin/part-00000
परिणाम वेब इंटरफेस के माध्यम से भी देखे जा सकते हैं-
अब 'फ़ाइल सिस्टम ब्राउज़ करें' चुनें और /output_mapreducejoin तक जाएं।
भाग खोलें-आर-00000
परिणाम दिखाए गए हैं
नोट: कृपया ध्यान दें कि इस प्रोग्राम को अगली बार चलाने से पहले, आपको आउटपुट निर्देशिका /output_mapreducejoin को हटाना होगा
$HADOOP_HOME/bin/hdfs dfs -rm -r /output_mapreducejoin
वैकल्पिक रूप से आउटपुट डायरेक्टरी के लिए एक अलग नाम का उपयोग किया जा सकता है।
जॉइन आपको डेटा का स्वरूप बताते हैं। काउंटर, जिनके बारे में आगे चर्चा की जाएगी, आपको यह बताते हैं कि डेटा उत्पन्न करने वाले कार्य ने कैसा व्यवहार किया।
मैपरेड्यूस में काउंटर क्या है?
मैप रिड्यूस में काउंटर एक ऐसा तंत्र है जिसका उपयोग मैप रिड्यूस जॉब्स और इवेंट्स के बारे में सांख्यिकीय जानकारी एकत्र करने और मापने के लिए किया जाता है। काउंटर मैप रिड्यूस जॉब्स और इवेंट्स के बारे में सांख्यिकीय जानकारी को रिकॉर्ड करते हैं। tracMapReduce में विभिन्न कार्य सांख्यिकी जैसे कि संपन्न संक्रियाओं की संख्या और संक्रिया की प्रगति को मापने के लिए काउंटरों का उपयोग किया जाता है। MapReduce में समस्या निदान के लिए काउंटरों का उपयोग किया जाता है।
हाडोप काउंटर मैप या रिड्यूस के लिए कोड में लॉग संदेश डालने के समान हैं। यह जानकारी मैपरिड्यूस जॉब प्रोसेसिंग में किसी समस्या के निदान के लिए उपयोगी हो सकती है।
आमतौर पर, हैडूप में ये काउंटर किसी प्रोग्राम (मैप या रिड्यूस) में परिभाषित किए जाते हैं और किसी विशेष घटना या स्थिति (जो उस काउंटर से संबंधित हो) के घटित होने पर निष्पादन के दौरान बढ़ाए जाते हैं। हैडूप काउंटरों का एक बहुत अच्छा अनुप्रयोग यह है कि... tracइनपुट डेटासेट से k वैध और अवैध रिकॉर्ड।
मैपरिड्यूस काउंटर के प्रकार
मैप रिड्यूस काउंटर मूल रूप से दो प्रकार के होते हैं।
- Hadoop के अंतर्निर्मित काउंटर: कुछ अंतर्निहित Hadoop काउंटर हैं जो प्रत्येक जॉब के लिए मौजूद हैं। नीचे अंतर्निहित काउंटर समूह दिए गए हैं-
- मैपरिड्यूस टास्क काउंटर — यह अपने निष्पादन समय के दौरान कार्य-विशिष्ट जानकारी (जैसे, इनपुट रिकॉर्ड की संख्या) एकत्र करता है।
- फ़ाइल सिस्टम काउंटर — यह किसी कार्य द्वारा पढ़े या लिखे गए बाइट्स की संख्या जैसी जानकारी एकत्र करता है।
- फ़ाइलइनपुटफ़ॉर्मेट काउंटर — FileInputFormat के माध्यम से पढ़े गए बाइट्स की संख्या की जानकारी एकत्र करता है।
- फ़ाइलआउटपुटफ़ॉर्मेट काउंटर — FileOutputFormat के माध्यम से लिखे गए बाइट्स की संख्या की जानकारी एकत्र करता है।
- नौकरी काउंटर — ये काउंटर किसी कार्य के लिए शुरू किए गए कार्यों की संख्या जैसे कार्य-व्यापी आँकड़े दर्ज करते हैं।
- उपयोगकर्ता द्वारा परिभाषित काउंटर: अंतर्निर्मित काउंटरों के अलावा, उपयोगकर्ता प्रोग्रामिंग भाषाओं द्वारा प्रदान की गई समान कार्यक्षमताओं का उपयोग करके अपने स्वयं के काउंटर परिभाषित कर सकता है। उदाहरण के लिए, 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)दोनों में प्रतिवाद की अवधारणा एक समान है।











