MapReduce是一个编程模型,用于处理大规模数据集。它可以将工作分布到多个计算机上,以并行方式处理数据,并生成最终的结果。MapReduce的主要思想是将问题分解为两个阶段:Map阶段和Reduce阶段。
aspectjtools-1.6.5.jar
下面是一个简单的MapReduce案例,用于计算一个文本文件中每个单词的出现次数:
问题描述:给定一个文本文件,其中包含多个句子。我们的任务是找出每个单词在文件中出现的次数。
Map阶段:
输入:文本文件中的每一行(假设单词之间由空格分隔)。
处理:对于每一行,将其拆分成单词,并为每个单词生成一个键值对。键是单词本身,值通常是1(表示该单词出现一次)。
输出:键-值对(单词,1)。
Reduce阶段:
输入:所有具有相同键(即相同单词)的键值对。
处理:对于每个键,将其对应的所有值相加,得到该单词在文件中出现的总次数。
输出:键-值对(单词,该单词在文件中出现的次数)。
案例分析:
Map类的实现:
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.mapreduce.Mapper;
public class WordCountMapper 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();
String[] words = line.split(" ");
for (String str : words) {
word.set(str);
context.write(word, one);
}
}
}
Reduce类的实现:
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
sh
hdfs dfs -rm -r /output
假设我们有一个文本文件example.txt,内容如下:
Hello world
Hello Hadoop
Hadoop is fun
Map阶段将处理这个文件,并生成如下的键值对:
makefile
Hello, 1
world, 1
Hello, 1
Hadoop, 1
Hadoop, 1
is, 1
fun, 1
Reduce阶段将接收这些键值对,并合并具有相同键的值。因此,最终的输出将是:
makefile
Hello, 2
world, 1
Hadoop, 2
is, 1
fun, 1
这表明“Hello”在文件中出现了2次,“world”出现了1次,依此类推。