2,Hadoop MapReduce 入门实践:WordCount 单词计数

2,Hadoop MapReduce 入门实践:WordCount 单词计数 摘要本文通过 Hadoop MapReduce 的经典示例——WordCount 单词计数程序详细演示了从环境准备、数据上传、程序运行到结果查看的完整流程。适合 Hadoop 初学者快速理解 MapReduce 编程模型的核心思想与基本操作。1. 概述单词计数WordCount是 Hadoop MapReduce 框架中最经典、最能体现其分布式计算思想的入门程序常被称为 MapReduce 版的“Hello World”。该程序的功能是统计一系列文本文件中每个单词出现的次数。其完整源代码通常位于 Hadoop 安装包的src/examples目录下。基本流程如下图所示2. 实践步骤2.1 准备工作假设我们已使用普通用户“hadoop”登录到名为“Master.Hadoop”的服务器。1创建本地示例文件首先在用户主目录下创建用于存放示例文件的文件夹cd /home/hadoop mkdir file接着在该文件夹内创建两个文本文件并写入简单内容cd /home/hadoop/file echo Hello World file1.txt echo Hello Hadoop file2.txt操作完成后目录结构如下2在 HDFS 上创建输入文件夹在 Hadoop 分布式文件系统HDFS上创建一个目录用于存放待处理的输入文件hadoop fs -mkdir /user/hadoop/input3上传本地文件到 HDFS将刚才创建的本地文件上传到 HDFS 的输入目录中hadoop fs -put /home/hadoop/file/* /user/hadoop/input/2.2 运行 WordCount 程序1在集群上运行 WordCount 程序使用 Hadoop 自带的示例 Jar 包运行 WordCount 作业。请注意示例 Jar 包的路径可能因安装方式而异本例中位于/usr/hadoop/hadoop-examples-1.0.0.jar。命令格式hadoop jar [Jar包路径] wordcount [输入目录] [输出目录]具体命令hadoop jar /usr/hadoop/hadoop-examples-1.0.0.jar wordcount /user/hadoop/input /user/hadoop/output注意输出目录本例中的/user/hadoop/output在运行前必须不存在否则程序会报错。2MapReduce 执行过程显示信息命令执行后控制台会输出详细的作业执行日志包括作业ID、Map和Reduce任务的数量、输入输出记录数等。Hadoop 命令会启动一个 JVM 来运行 MapReduce 程序。从日志中可以看到作业被赋予了一个唯一的 ID如job_201202292213_0002。输入文件数量Total input paths to process: 2。Map 和 Reduce 任务的输入输出记录数及字节数。本例中Map 任务数量为 2Reduce 任务数量为 1。3WordCount 程序核心代码解析WordCount 程序的 Java 源代码清晰地展示了 MapReduce 编程模型的核心思想。下面是对其关键 Map 和 Reduce 函数的工作原理解析Map 函数Mapper 类Map 函数负责将输入数据拆分为键值对key-value pairs。在 WordCount 中Map 函数读取文本文件的每一行按空格分割单词并为每个单词输出中间键值对单词, 1。public static class TokenizerMapper extends MapperObject, Text, Text, IntWritable{ private final static IntWritable one new IntWritable(1); private Text word new Text(); public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { // 1. 将一行文本按空格分割成单词数组 StringTokenizer itr new StringTokenizer(value.toString()); // 2. 遍历每个单词输出 单词, 1 键值对 while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } }工作原理输入Map 函数接收一行文本作为输入键是行偏移量通常忽略值是文本内容。处理使用StringTokenizer将文本分割成单词。输出为每个单词生成一个中间键值对其中键是单词本身Text 类型值是整数 1IntWritable 类型表示该单词出现了一次。Reduce 函数Reducer 类Reduce 函数负责对 Map 阶段输出的中间结果进行汇总。在 WordCount 中Reduce 函数接收同一个单词的所有计数值都是 1将它们累加得到该单词的总出现次数。public static class IntSumReducer extends ReducerText, IntWritable, Text, IntWritable { private IntWritable result new IntWritable(); public void reduce(Text key, IterableIntWritable values, Context context ) throws IOException, InterruptedException { // 1. 初始化计数器 int sum 0; // 2. 遍历该单词的所有计数值都是 1并累加 for (IntWritable val : values) { sum val.get(); } // 3. 输出最终结果 单词, 总次数 result.set(sum); context.write(key, result); } }工作原理输入Reduce 函数接收一个单词Text 类型和该单词对应的所有计数值列表IterableIntWritable。处理遍历计数值列表将所有值累加得到该单词的总出现次数。输出输出最终键值对键是单词值是该单词的总出现次数。MapReduce 执行流程总结Map 阶段多个 Map 任务并行处理输入文件每个 Map 任务将文本分割成单词并输出单词, 1键值对。Shuffle 阶段Hadoop 框架自动将相同单词的中间结果发送到同一个 Reduce 任务。Reduce 阶段Reduce 任务接收属于自己分区的单词及其计数值列表进行累加计算。输出最终结果写入 HDFS每个 Reduce 任务输出一个结果文件如part-r-00000。通过这个简单的 WordCount 示例可以清晰地理解 MapReduce 的“分而治之”思想Map 阶段进行分布式处理Reduce 阶段进行汇总聚合两者通过 Shuffle 阶段连接共同完成大规模数据的并行计算。2.3 查看运行结果1查看 HDFS 上的输出目录作业完成后结果会输出到指定的 HDFS 目录中。使用以下命令查看hadoop fs -ls /user/hadoop/output可以看到生成了多个文件其中最终的计算结果通常保存在名为part-r-00000的文件中。2查看结果文件内容使用以下命令查看结果文件的具体内容hadoop fs -cat /user/hadoop/output/part-r-00000输出将显示每个单词及其出现的次数例如Hadoop 1 Hello 2 World 13. 总结通过本次 WordCount 实践我们完整体验了 Hadoop MapReduce 作业的编写、提交与执行流程。从创建数据、上传到 HDFS、提交作业到查看结果每一步都是理解分布式计算的基础。掌握这个“Hello World”程序后可以进一步学习更复杂的 MapReduce 编程模型和优化技巧。b593fd1998314ce95e8.png width609 /