इस ट्यूटोरियल में, आप MapReduce उदाहरणों के साथ Hadoop का उपयोग करना सीखेंगे। इनपुट डेटा का उपयोग SalesJan2009.csv है। इसमें बिक्री से संबंधित जानकारी जैसे उत्पाद का नाम, मूल्य, भुगतान मोड, शहर, ग्राहक का देश आदि शामिल हैं। लक्ष्य प्रत्येक देश में उत्पादों की संख्या का पता लगाना है।
इस ट्यूटोरियल में, आप सीखेंगे-
- पहला Hadoop MapReduce Program
- सेल्समैपर क्लास की व्याख्या
- SalesCountryReducer वर्ग की व्याख्या
- SalesCountryDriver वर्ग की व्याख्या
पहला Hadoop MapReduce Program
अब इस MapReduce ट्यूटोरियल में, हम अपना पहला Java MapReduce प्रोग्राम बनाएंगे:
सुनिश्चित करें कि आपके पास Hadoop स्थापित है। वास्तविक प्रक्रिया शुरू करने से पहले, उपयोगकर्ता को 'hduser' में बदल दें (Hadoop कॉन्फ़िगरेशन के दौरान उपयोग की जाने वाली आईडी, आप अपने Hadoop प्रोग्रामिंग कॉन्फ़िगरेशन के दौरान उपयोग किए गए उपयोगकर्ता पर स्विच कर सकते हैं)।
su - hduser_
चरण 1)
MapReduce उदाहरण में शॉन के रूप में MapReduceTutorial नाम के साथ एक नई निर्देशिका बनाएं
sudo mkdir MapReduceTutorial
अनुमति दें
sudo chmod -R 777 MapReduceTutorial
SalesMapper.java
package SalesCountry;import java.io.IOException;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapred.*;public class SalesMapper extends MapReduceBase implements Mapper{private final static IntWritable one = new IntWritable(1);public void map(LongWritable key, Text value, OutputCollector output, Reporter reporter) throws IOException {String valueString = value.toString();String[] SingleCountryData = valueString.split(",");output.collect(new Text(SingleCountryData[7]), one);}}
SalesCountryReducer.java
package SalesCountry;import java.io.IOException;import java.util.*;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapred.*;public class SalesCountryReducer extends MapReduceBase implements Reducer{public void reduce(Text t_key, Iterator values, OutputCollector output, Reporter reporter) throws IOException {Text key = t_key;int frequencyForCountry = 0;while (values.hasNext()) {// replace type of value with the actual type of our valueIntWritable value = (IntWritable) values.next();frequencyForCountry += value.get();}output.collect(key, new IntWritable(frequencyForCountry));}}
SalesCountryDriver.java
package SalesCountry;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.*;import org.apache.hadoop.mapred.*;public class SalesCountryDriver {public static void main(String[] args) {JobClient my_client = new JobClient();// Create a configuration object for the jobJobConf job_conf = new JobConf(SalesCountryDriver.class);// Set a name of the Jobjob_conf.setJobName("SalePerCountry");// Specify data type of output key and valuejob_conf.setOutputKeyClass(Text.class);job_conf.setOutputValueClass(IntWritable.class);// Specify names of Mapper and Reducer Classjob_conf.setMapperClass(SalesCountry.SalesMapper.class);job_conf.setReducerClass(SalesCountry.SalesCountryReducer.class);// Specify formats of the data type of Input and outputjob_conf.setInputFormat(TextInputFormat.class);job_conf.setOutputFormat(TextOutputFormat.class);// Set input and output directories using command line arguments,//arg[0] = name of input directory on HDFS, and arg[1] = name of output directory to be created to store the output file.FileInputFormat.setInputPaths(job_conf, new Path(args[0]));FileOutputFormat.setOutputPath(job_conf, new Path(args[1]));my_client.setConf(job_conf);try {// Run the jobJobClient.runJob(job_conf);} catch (Exception e) {e.printStackTrace();}}}
यहाँ फ़ाइलें डाउनलोड करें
इन सभी फाइलों की फाइल परमिशन की जांच करें
और यदि 'पठन' अनुमतियाँ गायब हैं तो उसी को अनुदान दें-
चरण 2)
निर्यात क्लासपाथ को नीचे दिए गए उदाहरण में दिखाया गया है
export CLASSPATH="$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.2.0.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-common-2.2.0.jar:$HADOOP_HOME/share/hadoop/common/hadoop-common-2.2.0.jar:~/MapReduceTutorial/SalesCountry/*:$HADOOP_HOME/lib/*"
चरण 3)
संकलित जावा फाइलें (ये फाइलें निर्देशिका में मौजूद हैं-MapReduceHandsOn )। इसकी क्लास फाइल्स को पैकेज डायरेक्टरी में रखा जाएगा
javac -d . SalesMapper.java SalesCountryReducer.java SalesCountryDriver.java
इस चेतावनी को सुरक्षित रूप से अनदेखा किया जा सकता है।
यह संकलन जावा स्रोत फ़ाइल (यानी हमारे मामले में SalesCountry ) में निर्दिष्ट पैकेज नाम के साथ एक वर्तमान निर्देशिका में एक निर्देशिका बनाएगा और इसमें सभी संकलित वर्ग फ़ाइलों को डाल देगा।
चरण 4)
एक नई फ़ाइल बनाएं Manifest.txt
sudo gedit Manifest.txt
इसमें निम्न पंक्तियाँ जोड़ें,
Main-Class: SalesCountry.SalesCountryDriver
SalesCountry.SalesCountryDriver मुख्य वर्ग का नाम है। कृपया ध्यान दें कि आपको इस पंक्ति के अंत में एंटर की को हिट करना है।
चरण 5)
जार फ़ाइल बनाएँ
jar cfm ProductSalePerCountry.jar Manifest.txt SalesCountry/*.class
जांचें कि जार फ़ाइल बनाई गई है
चरण 6)
Hadoop शुरू करें
$HADOOP_HOME/sbin/start-dfs.sh
$HADOOP_HOME/sbin/start-yarn.sh
चरण 7)
फ़ाइल SalesJan2009.csv को ~ / inputMapReduce में कॉपी करें
अब एचडीएसएफ में ~ / inputMapReduce कॉपी करने के लिए नीचे दिए गए कमांड का उपयोग करें ।
$HADOOP_HOME/bin/hdfs dfs -copyFromLocal ~/inputMapReduce /
हम इस चेतावनी को सुरक्षित रूप से अनदेखा कर सकते हैं।
सत्यापित करें कि फ़ाइल वास्तव में कॉपी की गई है या नहीं।
$HADOOP_HOME/bin/hdfs dfs -ls /inputMapReduce
चरण 8)
MapReduce को रन करें
$HADOOP_HOME/bin/hadoop jar ProductSalePerCountry.jar /inputMapReduce /mapreduce_output_sales
यह HDFS पर mapreduce_output_sales नाम से एक आउटपुट डायरेक्टरी बनाएगा। इस निर्देशिका की सामग्री एक फ़ाइल होगी जिसमें प्रति देश उत्पाद बिक्री होती है।
चरण 9)
परिणाम को कमांड इंटरफ़ेस के माध्यम से देखा जा सकता है,
$HADOOP_HOME/bin/hdfs dfs -cat /mapreduce_output_sales/part-00000
परिणाम वेब इंटरफेस के माध्यम से भी देखे जा सकते हैं-
एक वेब ब्राउज़र में आर खोलें।
अब 'फाइल सिस्टम ब्राउज़ करें ' चुनें और / mapreduce_output_sales पर नेविगेट करें
ओपन पार्ट- r-00000
सेल्समैपर क्लास की व्याख्या
इस खंड में, हम SalesMapper वर्ग के कार्यान्वयन को समझेंगे ।
1. हम अपनी कक्षा के लिए पैकेज का नाम निर्दिष्ट करके शुरू करते हैं। SalesCountry हमारे पैकेज का एक नाम है। कृपया ध्यान दें कि संकलन का आउटपुट, SalesMapper.class इस पैकेज के नाम से एक निर्देशिका में जाएगा: SalesCountry ।
इसके बाद, हम लाइब्रेरी पैकेज आयात करते हैं।
स्नैपशॉट नीचे SalesMapper वर्ग का कार्यान्वयन दिखाता है-
नमूना कोड स्पष्टीकरण:
1. SalesMapper वर्ग परिभाषा-
सार्वजनिक वर्ग SalesMapper का विस्तार करता है
हर मैपर वर्ग को MapReduceBase क्लास से बढ़ाया जाना चाहिए और इसे मैपर इंटरफ़ेस लागू करना होगा ।
2. 'मानचित्र' कार्य को परिभाषित करना-
public void map(LongWritable key,Text value,OutputCollectoroutput,Reporter reporter) throws IOException
मैपर वर्ग का मुख्य भाग एक 'नक्शा ()' विधि है जो चार तर्कों को स्वीकार करती है।
'मैप ()' विधि के हर कॉल पर , एक कुंजी-मूल्य जोड़ी ( 'कुंजी' और ' कोड में ' मूल्य ) पारित किया जाता है।
'मैप ()' विधि इनपुट टेक्स्ट को विभाजित करके शुरू होती है जिसे एक तर्क के रूप में प्राप्त किया जाता है। यह इन पंक्तियों को शब्दों में विभाजित करने के लिए एक टोकन का उपयोग करता है।
String valueString = value.toString();String[] SingleCountryData = valueString.split(",");
यहाँ, ',' का उपयोग परिसीमनक के रूप में किया जाता है।
इसके बाद, सरणी 'SingleCountryData' के 7 वें सूचकांक और '1' के मान पर एक रिकॉर्ड का उपयोग करके एक जोड़ी बनाई जाती है ।
output.collect (नया पाठ (SingleCountryData [7]), एक);
हम 7 वें इंडेक्स में रिकॉर्ड का चयन कर रहे हैं क्योंकि हमें कंट्री डेटा की जरूरत है और यह सरणी 'सिंगलकाउंट्रीडाटा' में 7 वें इंडेक्स पर है ।
कृपया ध्यान दें कि हमारा इनपुट डेटा नीचे प्रारूप में है (जहां देश 7 वें सूचकांक पर है, 0 के साथ एक प्रारंभिक सूचकांक के रूप में) -
Transaction_date, उत्पाद, मूल्य, Payment_Type, नाम, शहर, राज्य, देश , Account_Created, Last_Login, अक्षांश, देशांतर
मैपर का एक आउटपुट फिर से एक कुंजी-मूल्य वाला जोड़ा है जो 'OutputCollector' के 'कलेक्ट ()' पद्धति का उपयोग करके आउटपुट किया जाता है ।
SalesCountryReducer वर्ग की व्याख्या
इस खंड में, हम SalesCountryReducer वर्ग के कार्यान्वयन को समझेंगे ।
1. हम अपनी कक्षा के लिए पैकेज का नाम निर्दिष्ट करके शुरू करते हैं। SalesCountry आउट पैकेज का एक नाम है। कृपया ध्यान दें कि संकलन का उत्पादन, SalesCountryReducer.class इस पैकेज के नाम से एक निर्देशिका में जाएगा: Saleswountry ।
इसके बाद, हम लाइब्रेरी पैकेज आयात करते हैं।
स्नैपशॉट नीचे SalesCountryReducer वर्ग का कार्यान्वयन दिखाता है-
कोड स्पष्टीकरण:
1. SalesCountryReducer वर्ग परिभाषा-
सार्वजनिक वर्ग
यहां, पहले दो डेटा प्रकार, 'टेक्स्ट' और 'इंटवर्टेबल' रिड्यूसर के इनपुट की-वैल्यू के डेटा प्रकार हैं।
मैपर का आउटपुट <देशनाम 1, 1>, <देशनाम 2, 1> के रूप में है। मैपर का यह आउटपुट रिड्यूसर का इनपुट बन जाता है। तो, अपने डेटा प्रकार के साथ संरेखित करने के लिए, पाठ और IntWritable यहाँ डेटा प्रकार के रूप में उपयोग किया जाता है।
अंतिम दो डेटा प्रकार, 'टेक्स्ट' और 'इंटवर्टेबल' डेटा-प्रकार के आउटपुट हैं जो कि-वैल्यू पेयर के रूप में रिड्यूसर द्वारा उत्पन्न किए जाते हैं।
प्रत्येक Reducer वर्ग को MapReduceBase वर्ग से बढ़ाया जाना चाहिए और इसे Reducer इंटरफ़ेस लागू करना होगा ।
2. परिभाषित 'कम' समारोह-
public void reduce( Text t_key,Iteratorvalues,OutputCollector output,Reporter reporter) throws IOException {
कम करने के लिए एक इनपुट () विधि कई मूल्यों की एक सूची के साथ एक कुंजी है।
उदाहरण के लिए, हमारे मामले में, यह होगा-
<संयुक्त अरब अमीरात, 1>, <संयुक्त अरब अमीरात, 1>, <संयुक्त अरब अमीरात, 1>, <संयुक्त अरब अमीरात, 1>, <संयुक्त अरब अमीरात, 1>, <संयुक्त अरब अमीरात, 1>।
यह <संयुक्त अरब अमीरात, {1,1,1,1,1,1}> के रूप में रिड्यूसर को दिया गया है
तो, यह प्रपत्र के तर्कों, पहले दो डेटा प्रकार उपयोग किया जाता है, अर्थात स्वीकार करने के लिए।, पाठ और इटरेटर
अगला तर्क प्रकार आउटपुटकॉल्टर <टेक्स्ट, इंटवर्टेबल> का है जो रीड्यूसर चरण के आउटपुट को इकट्ठा करता है।
कम () विधि कुंजी मान की प्रतिलिपि बनाकर और आवृत्ति गणना को 0 से प्रारंभ करती है।
पाठ कुंजी = t_key; int frequencyForCountry = 0;
फिर, list जबकि ’ लूप का उपयोग करते हुए , हम कुंजी से जुड़े मूल्यों की सूची के माध्यम से पुनरावृत्ति करते हैं और सभी मूल्यों को जोड़कर अंतिम आवृत्ति की गणना करते हैं।
while (values.hasNext()) {// replace type of value with the actual type of our valueIntWritable value = (IntWritable) values.next();frequencyForCountry += value.get();}
अब, हम परिणाम को कुंजी और प्राप्त आवृत्ति गणना के रूप में आउटपुट कलेक्टर पर धकेलते हैं ।
नीचे कोड यह करता है-
output.collect(key, new IntWritable(frequencyForCountry));
SalesCountryDriver वर्ग की व्याख्या
इस खंड में, हम SalesCountryDriver वर्ग के कार्यान्वयन को समझेंगे
1. हम अपनी कक्षा के लिए पैकेज का नाम निर्दिष्ट करके शुरू करते हैं। SalesCountry आउट पैकेज का एक नाम है। कृपया ध्यान दें कि संकलन का आउटपुट, SalesCountryDriver.class इस पैकेज नाम से निर्देशिका में जाएगा: SalesCountry ।
यहां लाइब्रेरी पैकेज को आयात करने के लिए कोड के बाद एक पंक्ति निर्दिष्ट पैकेज नाम है।
2. एक ड्राइवर वर्ग को परिभाषित करें जो एक नया ग्राहक कार्य, कॉन्फ़िगरेशन ऑब्जेक्ट बनाएगा और मैपर और रेड्यूसर वर्गों का विज्ञापन करेगा।
ड्राइवर वर्ग Hadoop में चलाने के लिए हमारे MapReduce को सेट करने के लिए जिम्मेदार है। इस वर्ग में, हम नौकरी का नाम, डेटा प्रकार के इनपुट / आउटपुट और मैपर और रिड्यूसर वर्गों के नाम निर्दिष्ट करते हैं ।
3. नीचे दिए गए कोड स्निपेट में, हम इनपुट और आउटपुट निर्देशिकाओं को सेट करते हैं, जो क्रमशः इनपुट डेटासेट का उपभोग करने और आउटपुट का उत्पादन करने के लिए उपयोग किया जाता है।
arg [0] और arg [1] कमांड-लाइन तर्क हैं जो MapReduce में दिए गए कमांड के साथ दिए गए हैं, यानी,
$ HADOOP_HOME / बिन / हैडप जार
4. हमारे काम को ट्रिगर करें
नीचे कोड शुरू MapReduce नौकरी का निष्पादन-
try {// Run the jobJobClient.runJob(job_conf);} catch (Exception e) {e.printStackTrace();}