博客
关于我
MapReduce程序(一)——wordCount
阅读量:801 次
发布时间:2023-02-07

本文共 3713 字,大约阅读时间需要 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 /userhdfs 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. 参考文献

    你可能感兴趣的文章
    Python关于strftime函数详细解析 附实战代码
    查看>>
    Python3 tutorial day3
    查看>>
    python3 week4
    查看>>
    Python3 创建数组
    查看>>
    python3 套接字异常(a byte-like object is required not str)
    查看>>
    python3 实现用户三次输入错误记录黑名单并对该用户登录锁定-day1
    查看>>
    python3 文本变图片
    查看>>
    Python3 查看 com 组件的属性
    查看>>
    python3 案例分享--发邮件
    查看>>
    python3 模板库_Python3 标准库概览_Python教程_我爱模板网 - 提供下载各种免费建站资源,免费网站模板,免费网页特效,让你爱上建站!...
    查看>>
    Python3 求最大/小值及索引值 Numpy
    查看>>
    python3+django使用celery执行某些任务失败的解决方案
    查看>>
    Python3+Requests+Unittest实战系列【一】
    查看>>
    python3+requests+unittest实战系列【一】
    查看>>
    python3+requests+unittest实战系列【二】
    查看>>
    Python3+Requests+Unittest实战系列【二】
    查看>>
    python3----ASCII
    查看>>
    Python3-selenium自动化测试框架,结合HTMLTestRunner测试报告!
    查看>>
    Python3-如何自我更新作为服务运行的应用程序
    查看>>
    Python3.1-网格模拟概念性问题
    查看>>