25.1.26(Map Reduce3)
3. 案例分析:单词计数
下面我们通过一个简单的单词计数案例来深入理解 MapReduce 的工作流程。
假设我们有一个包含多篇文章的文本文件,我们想要统计每个单词在这些文章中出现的次数。
Map 阶段的代码如下:
import java.io.IOException; import java.util.StringTokenizer; 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(); @Override public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // 将输入的一行文本转换为字符串 String line = value.toString(); // 使用空格分割字符串,得到单词列表 StringTokenizer tokenizer = new StringTokenizer(line); while (tokenizer.hasMoreTokens()) { // 获取每个单词,并将其作为键,出现次数1作为值输出 word.set(tokenizer.nextToken()); context.write(word, one); } } }
在上述代码中,WordCountMapper类继承自Mapper类,并重写了map方法。在map方法中,我们首先将输入的一行文本转换为字符串,然后使用StringTokenizer将其分割成单词。对于每个单词,我们将其包装成Text类型的对象作为键,将出现次数 1 包装成IntWritable类型的对象作为值,通过context.write方法输出。
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> { @Override public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; // 对相同单词的出现次数进行累加 for (IntWritable value : values) { sum += value.get(); } // 将单词和其总出现次数输出 context.write(key, new IntWritable(sum)); } }
在WordCount类的main方法中,我们首先创建了一个Configuration对象和一个Job对象。然后,我们通过job.setMapperClass和job.setReducerClass方法设置了 Map 阶段和 Reduce 阶段的处理类,通过job.setOutputKeyClass和job.setOutputValueClass方法设置了输出键值对的类型。接着,我们使用FileInputFormat.addInputPath和FileOutputFormat.setOutputPath方法设置了输入文件路径和输出文件路径。最后,通过job.waitForCompletion(true)提交任务并等待其完成。
当我们在 Hadoop 集群上运行上述单词计数程序后,可以得到每个单词及其出现次数的统计结果。以下是一个简单的结果示例(部分展示):
单词 | 出现次数 |
"hadoop" | 10 |
"bigdata" | 8 |
"mapreduce" | 6 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
2024-01-26 24.1.26