hadoop
MapReduce का परिचय
खोज…
वाक्य - विन्यास
उदाहरण चलाने के लिए, कमांड सिंटैक्स है:
bin/hadoop jar hadoop-*-examples.jar wordcount [-m <#maps>] [-r <#reducers>] <in-dir> <out-dir>
एचडीएफएस (स्थानीय से) में डेटा कॉपी करने के लिए:
bin/hadoop dfs -mkdir <hdfs-dir> //not required in hadoop 0.17.2 and later bin/hadoop dfs -copyFromLocal <local-dir> <hdfs-dir>
टिप्पणियों
Hadoop में MapReduce का उपयोग करके वर्ड काउंट प्रोग्राम।
शब्द गणना कार्यक्रम (जावा और पायथन में)
शब्द गणना कार्यक्रम MapReduce में "हैलो वर्ल्ड" प्रोग्राम की तरह है।
Hadoop MapReduce आसानी से लिखने वाले अनुप्रयोगों के लिए एक सॉफ्टवेयर फ्रेमवर्क है जो एक विश्वसनीय, दोष-सहिष्णु तरीके से कमोडिटी हार्डवेयर के बड़े क्लस्टरों (हजारों नोड्स) पर समानांतर में डेटा (मल्टी-टेराबाइट डेटा-सेट) की बड़ी मात्रा में प्रक्रिया करता है।
MapReduce का कार्य आमतौर पर इनपुट डेटा-सेट को स्वतंत्र चंक्स में विभाजित करता है जो पूरी तरह से समानांतर रूप से मानचित्र कार्यों द्वारा संसाधित होते हैं। फ्रेम मैप्स के आउटपुट को सॉर्ट करता है, जो बाद में कम किए गए कार्यों के लिए इनपुट होते हैं। आमतौर पर नौकरी के इनपुट और आउटपुट दोनों को फाइल-सिस्टम में स्टोर किया जाता है। रूपरेखा शेड्यूलिंग कार्यों का ध्यान रखती है, उनकी निगरानी करती है और असफल कार्यों को फिर से निष्पादित करती है।
शब्द गणना उदाहरण:
WordCount उदाहरण पाठ फ़ाइलों को पढ़ता है और मायने रखता है कि शब्द कितनी बार होते हैं। इनपुट पाठ फ़ाइलें है और आउटपुट पाठ फ़ाइलें हैं, जिनमें से प्रत्येक पंक्ति में एक शब्द होता है और यह गणना की जाती है कि इसे कितनी बार टैब द्वारा अलग किया गया है।
प्रत्येक मैपर इनपुट के रूप में एक लाइन लेता है और इसे शब्दों में तोड़ता है। यह तब शब्द की एक कुंजी / मूल्य जोड़ी का उत्सर्जन करता है और प्रत्येक reducer प्रत्येक शब्द के लिए मायने रखता है और शब्द और योग के साथ एक ही कुंजी / मूल्य का उत्सर्जन करता है।
अनुकूलन के रूप में, रेड्यूसर का उपयोग मैप आउटपुट पर एक कॉम्बिनर के रूप में भी किया जाता है। यह प्रत्येक शब्द को एक रिकॉर्ड में जोड़कर नेटवर्क में भेजे गए डेटा की मात्रा को कम कर देता है।
शब्द गणना कोड:
package org.myorg;
import java.io.IOException;
import java.util.*;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
public class WordCount {
public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
context.write(word, one);
}
}
}
public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = new Job(conf, "wordcount");
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.waitForCompletion(true);
}
}
उदाहरण चलाने के लिए, कमांड सिंटैक्स है:
bin/hadoop jar hadoop-*-examples.jar wordcount [-m <#maps>] [-r <#reducers>] <in-dir> <out-dir>
इनपुट डायरेक्टरी की सभी फाइलें (ऊपर दी गई कमांड लाइन में dir कहलाती हैं) पढ़ी जाती हैं और इनपुट में शब्दों की गणना आउटपुट डायरेक्टरी (ऊपर आउट-डीआईआर) के लिए लिखी जाती है। यह माना जाता है कि दोनों इनपुट और आउटपुट एचडीएफएस में संग्रहित हैं। यदि आपका इनपुट पहले से एचडीएफएस में नहीं है, लेकिन कहीं न कहीं एक स्थानीय फाइल सिस्टम में है, तो आपको इस तरह से कमांड का उपयोग करके डेटा को एचडीएफएस में कॉपी करने की आवश्यकता है:
bin/hadoop dfs -mkdir <hdfs-dir> //not required in hadoop 0.17.2 and later
bin/hadoop dfs -copyFromLocal <local-dir> <hdfs-dir>
पायथन में शब्द गणना उदाहरण:
mapper.py
import sys
for line in sys.stdin:
# remove leading and trailing whitespace
line = line.strip()
# split the line into words
words = line.split()
# increase counters
for word in words:
print '%s\t%s' % (word, 1)
reducer.py
import sys
current_word = None
current_count = 0
word = None
for line in sys.stdin:
# remove leading and trailing whitespaces
line = line.strip()
# parse the input we got from mapper.py
word, count = line.split('\t', 1)
# convert count (currently a string) to int
try:
count = int(count)
except ValueError:
# count was not a number, so silently
# ignore/discard this line
continue
if current_word == word:
current_count += count
else:
if current_word:
print '%s\t%s' % (current_word, current_count)
current_count = count
current_word = word
if current_word == word:
print '%s\t%s' % (current_word, current_count)
उपर्युक्त कार्यक्रम को cat filename.txt | python mapper.py | sort -k1,1 | python reducer.py
का उपयोग करके चलाया जा सकता है cat filename.txt | python mapper.py | sort -k1,1 | python reducer.py