欢迎光临
我们一直在努力

Hadoop 经典案例:WordCount 原理 + 代码逐段解析 + 实操全流程

在 Hadoop 生态中,WordCount(单词计数)是 MapReduce 的 “Hello World”,能帮我们快速理解 **“分治 – 聚合”的分布式计算核心思想。本文从原理拆解→代码解析→集群实操→进阶扩展 ** 四个维度,带你吃透 WordCount 的开发与实践。

0. 前置环境准备(必看)

✅ 已部署 Hadoop 3.x 集群(确认core-site.xml、hdfs-site.xml配置正确);✅ 本地 IDE 导入 Hadoop 核心依赖(如hadoop-common-3.x.jar);✅ 测试数据test.txt(内容:hello hadoop hello mapreduce hadoop wordcount)提前上传至 HDFS。

一、WordCount 的 MapReduce 执行流程

MapReduce 的核心是 “分而治之”,流程分为 3 个阶段(附流程图):

  • Map 阶段:按行拆分数据,将每个单词标记为(单词, 1);
  • Shuffle 阶段(Hadoop 自动完成):
    • 分区:按key哈希分配到不同 Reducer;
    • 排序:Reducer 收到的键值对按key字典序排序;
    • 分组:相同key的键值对合并为(key, Iterable<value>);
  • Reduce 阶段:对相同单词的1进行累加,得到最终计数。
  • 二、WordCount 代码逐段解析(Hadoop 3.x)

    1. 依赖与包声明

    java

    运行

    package com.lzpu.mapreduce;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.Mapper;
    import org.apache.hadoop.mapreduce.Reducer;
    import org.apache.hadoop.mapreduce.Partitioner;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    import java.io.IOException;

    • IntWritable/Text:Hadoop 序列化类型(适配分布式环境,替代 Java 原生类型)。

    2. 主类与 Job 配置(核心入口)

    java

    运行

    public class WordCount {
    public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    conf.set("fs.defaultFS", "hdfs://hadoop01-002"); // 与集群配置一致

    Job job = Job.getInstance(conf, "word count");
    job.setJarByClass(WordCount.class);

    // 绑定核心组件
    job.setMapperClass(MyMapper.class);
    job.setReducerClass(MyReducer.class);
    job.setCombinerClass(MyReducer.class); // Map端局部聚合(优化Shuffle)
    job.setPartitionerClass(MyPartitioner.class); // 自定义分区
    job.setNumReduceTasks(2); // 分区数与Reducer数量一致

    // 配置输出类型
    job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(IntWritable.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);

    // 配置输入/输出路径
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));

    job.waitForCompletion(true);
    }

    ⚠️ 关键注意:FileOutputFormat的输出路径必须是 HDFS 上不存在的目录。

    3. 自定义 Partitioner(按首字母分区)

    java

    运行

    public static class MyPartitioner extends Partitioner<Text, IntWritable> {
    @Override
    public int getPartition(Text key, IntWritable value, int numPartitions) {
    char firstChar = key.toString().charAt(0);
    if (firstChar < 'N') return 0; // A-M → 0号分区
    else return 1; // N-Z → 1号分区
    }
    }

    4. Mapper 类(拆分单词 + 标记计数)

    java

    运行

    private static class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    @Override
    protected void map(LongWritable key, Text value, Context context) throws Exception {
    String[] arr = value.toString().split(" ");
    for (String s : arr) {
    if (!s.isEmpty()) { // 过滤空字符串
    context.write(new Text(s), new IntWritable(1));
    }
    }
    }
    }

    5. Reducer 类(累加计数)

    java

    运行

    private static class MyReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws Exception {
    int sum = 0;
    for (IntWritable v : values) {
    sum += v.get();
    }
    context.write(key, new IntWritable(sum));
    }
    }
    }

    三、集群实操:运行 WordCount 并验证结果

    步骤 1:编译打包代码

    在 IDEA 中操作:

  • File → Project Structure → Artifacts;
  • 选择JAR → From modules with dependencies,绑定主类WordCount;
  • Build → Build Artifacts生成 Jar 包(输出到out/artifacts/)。
  • 步骤 2:集群环境检查

    bash

    运行

    jps # 查看集群进程(需包含NameNode、ResourceManager)
    hadoop fs -chmod 777 /input /output # 赋予目录权限

    步骤 3:上传数据与 Jar 包到集群

    bash

    运行

    scp WordCount.jar root@hadoop01-002:~/mr_jars/
    hadoop fs -mkdir /input/wordcount
    hadoop fs -put test.txt /input/wordcount/

    步骤 4:提交 MapReduce 任务

    bash

    运行

    cd ~/mr_jars/
    hadoop fs -rm -r /output/wordcount_output # 删除旧输出目录
    hadoop jar WordCount.jar com.lzpu.mapreduce.WordCount /input/wordcount/test.txt /output/wordcount_output

    步骤 5:查看运行结果(附截图)

    bash

    运行

    hadoop fs -ls /output/wordcount_output
    hadoop fs -cat /output/wordcount_output/part-r-00000 # 0号分区结果
    hadoop fs -cat /output/wordcount_output/part-r-00001 # 1号分区结果

    图 1:WordCount 分区结果示例(插入终端截图,内容为:

    plaintext

    # part-r-00000(A-M)
    hadoop2
    hello2
    # part-r-00001(N-Z)
    mapreduce1
    wordcount1
    ```)

    ## 四、高频问题与解决方案
    | 问题现象 | 报错信息 | 解决方案 |
    |————————-|——————————————-|——————————————-|
    | 输出目录已存在 | `FileAlreadyExistsException` | `hadoop fs -rm -r /output/wordcount_output` |
    | 集群进程缺失 | `Connection refused` | 重启Hadoop:`start-all.sh` |
    | 权限不足 | `Permission denied` | `hadoop fs -chmod 777 /input /output` |

    ## 五、扩展学习:从WordCount到生产级任务
    1. **与Hive结合**:Hive的`SELECT word, COUNT(*) FROM test GROUP BY word`底层就是WordCount的MapReduce任务;
    2. **多文件输入**:用`FileInputFormat.addInputPath`添加多个输入文件;
    3. **输出格式自定义**:使用`TextOutputFormat`指定输出格式(如CSV)。

    ## 总结:WordCount的学习价值
    WordCount看似简单,却是理解Hadoop分布式计算的“敲门砖”——它的“分治-聚合”逻辑,正是大数据处理的核心思路。通过本次实践,我掌握了“代码编写→打包→集群提交→结果验证”的完整流程,也理解了Shuffle、Combiner等组件在分布式计算中的关键作用,为后续Hadoop生态的深入学习打下了基础。

    (发布后按要求截取“博文页面截图”“得分截图”,命名为“班级-姓名-学号-博文”“班级-姓名-学号-博文得分”,提交至指定网盘)

    总结

     1:技术收获 —— 从 WordCount 理解分布式计算的核心

    WordCount 的本质是 “将大任务拆分为小任务并行处理,再聚合结果”,这正是分布式计算的核心逻辑:

    • Map:解决 “数据拆分” 问题,让每个节点处理局部数据;
    • Shuffle:解决 “数据分组” 问题,保证相同 Key 的结果流向同一个 Reducer;
    • Reduce:解决 “结果聚合” 问题,完成最终计算。通过这个案例,我不仅掌握了 MapReduce 的代码开发,更理解了 Hadoop “分而治之” 的设计思想 —— 这是处理海量数据的基础。

     2:能力成长 —— 从 “代码编写” 到 “工程实践” 的转变

    本次实践让我跳出了 “只写代码” 的局限,养成了工程化的学习习惯:

  • 环境意识:学会检查集群状态、配置权限,不再依赖 “完美环境”;
  • 问题排查:能通过日志和命令定位 “输出目录已存在”“权限不足” 等实际问题;
  • 优化思维:理解 Combiner、自定义 Partitioner 等技巧的实际价值,而非仅停留在 “实现功能”。
  •  3:学习延伸 —— 从 WordCount 到 Hadoop 生态的学习路径

    WordCount 是 Hadoop 的入门案例,后续可延伸学习:

  • 进阶组件:YARN(资源管理)、HDFS(分布式存储)、Hive(数据仓库);
  • 生产场景:日志分析(统计访问量)、用户行为统计(按地域分组);
  • 技术对比:对比 Spark 的 WordCount 实现,理解不同计算框架的差异。
  • 分布式计算的学习是 “从案例到原理,再到场景” 的过程,WordCount 正是这个过程的起点。

    赞(0)
    未经允许不得转载:171主机测评 » Hadoop 经典案例:WordCount 原理 + 代码逐段解析 + 实操全流程
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址