MapReduce程序(一)——wordCount
发布日期:2025-04-12 00:11:17 浏览次数:9 分类:精选文章

本文共 3763 字,大约阅读时间需要 12 分钟。

Hadoop MapReduce WordCount程序开发与运行

本文将详细介绍基于Hadoop MapReduce的WordCount程序的开发与运行过程,包括程序设计、打包运行以及在Hadoop集群上运行的实际操作步骤。

1. MapReduce之WordCount的计算模型

1.1 WordCount的Map过程

在MapReduce的WordCount程序中,Map阶段的主要任务是将输入的文本文件按行分割,并将每行文本拆分成单词。具体来说,TokenizerMapper类通过StringTokenizer将每行文本按空格或其他分隔符分割成单词,并将每个单词及其计数(默认为1)作为Map任务的输出。

此外,Map任务会对输出的键值对进行排序,并执行Combine过程,将相同单词的计数值累加。这样可以确保Combine任务能够接收到有序且连续的键值对,从而提高效率。

1.2 WordCount的Reduce过程

Reduce阶段的主要任务是对Map阶段输出的有序键值对进行处理。IntSumReducer类会接收所有以相同单词为键的计数值,并将它们相加,得到该单词在整个文本中的总出现次数。

Reduce任务的输出即为最终的WordCount结果,键为单词,值为单词出现的总次数。

2. 打包运行WordCount程序

2.1 下载所需的驱动包

为了能够运行WordCount程序,需要下载并添加以下Hadoop相关的JAR包:

  • hadoop-common-2.6.0.jar
  • hadoop-mapreduce-client-core-2.6.0.jar
  • hadoop-test-1.2.1.jar

2.2 创建新的工程

  • 在Eclipse中创建名为WordCount的Java项目。
  • 在项目属性的Java Build Path中添加上述下载的JAR包。
  • 新增WordCount.java源文件,包含以下内容:
  • import java.io.IOException;
    import java.util.StringTokenizer;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;
    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.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    public class WordCount {
    public static class TokenizerMapper extends Mapper
    {
    private IntWritable one = new IntWritable(1);
    private Text word = new Text();
    @Override
    public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
    StringTokenizer itr = new StringTokenizer(value.toString());
    while (itr.hasMoreTokens()) {
    word.set(itr.nextToken());
    context.write(word, one);
    }
    }
    }
    public static class IntSumReducer extends Reducer
    , Text, IntWritable> {
    private IntWritable result = new IntWritable();
    @Override
    public void reduce(Text key, Iterable
    values, Context context) throws IOException, InterruptedException {
    int sum = 0;
    for (IntWritable val : values) {
    sum += val.get();
    }
    result.set(sum);
    context.write(key, result);
    }
    }
    public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    Job job = Job.getInstance(conf, "word count");
    job.setJarByClass(WordCount.class);
    job.setMapperClass(TokenizerMapper.class);
    job.setCombinerClass(IntSumReducer.class);
    job.setReducerClass(IntSumReducer.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
    }

    2.3 打包源文件

  • 在Eclipse中选择文件,右键单击并导出为JAR文件,选择WordCount项目作为导出的基础,设置输出路径和文件名。
  • 打包完成后,会在指定路径生成WordCount.jar文件。
  • 2.4 启动HDFS服务

  • 打开终端,进入/usr/local/Cellar/hadoop/2.6.0/sbin目录。
  • 执行以下命令启动HDFS服务:
    start-dfs.sh
  • 检查是否启动成功,执行jps查看进程。
  • 2.5 将文件上传到HDFS

  • 创建HDFS上的输入和输出文件夹:
    hdfs dfs -mkdir /user
    hdfs dfs -mkdir /user/input
  • 将本地文件上传到HDFS:
    hdfs dfs -put /Users/你的路径/test*.html /user/input
  • 2.6 运行JAR文件

  • 创建工作目录:
    mkdir WorkSpace
  • WordCount.jar复制到工作目录:
    cp /你的路径/WordCount.jar ./WorkSpace
  • 运行JAR文件:
    hadoop jar WorkSpace/WordCount.jar WordCount /user/input /user/output
  • 3. 查看运行结果

  • 检查输出文件:
    hdfs dfs -ls /user/output
  • 查看具体内容:
    hdfs dfs -cat /user/output/part-r-00000
  • 4. 常见问题

    • 如果程序运行失败,需检查日志文件:
      hadoop job -debug
    • 确保输入文件格式正确,且HDFS集群运行正常。

    5. 参考文献

    上一篇:MapReduce编程模型简介和总结
    下一篇:MapReduce程序依赖的jar包

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年05月11日 23时07分33秒