文库网
关注排行榜

当前无数据...

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

相信大家看了博主上一篇博客《什么是MapReduce
》后,对MapReduce的概念有了更深的认知!本篇博客,博主给大家带来的是MapReduce的一个简单的实战项目——统计输出给定的文本文档每一个单词出现的总次数。

目录


在进行之前我们先看一下我们的数据源:

{tilte}-admin


1. 创建Maven工程

下面的跟之前使用API一样,我们同样需要在IDEA中使用JAVA代码来书写MapReduce。这时候我们需要新建一个一个Maven工程

  • 1. 创建项目

{tilte}-admin

  • 2. 在pom.xml文件中添加如下依赖
  1. <code class="prism language-java"> <dependencies>
  2. <dependency>
  3. <groupId>junit</groupId>
  4. <artifactId>junit</artifactId>
  5. <version>RELEASE</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.logging.log4j</groupId>
  9. <artifactId>log4j-core</artifactId>
  10. <version>2.8.2</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.apache.hadoop</groupId>
  14. <artifactId>hadoop-common</artifactId>
  15. <version>2.7.2</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.apache.hadoop</groupId>
  19. <artifactId>hadoop-client</artifactId>
  20. <version>2.7.2</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.apache.hadoop</groupId>
  24. <artifactId>hadoop-hdfs</artifactId>
  25. <version>2.7.2</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>jdk.tools</groupId>
  29. <artifactId>jdk.tools</artifactId>
  30. <version>1.8</version>
  31. <scope>system</scope>
  32. <systemPath>D:/java/jdk-1.8.0/lib/tools.jar</systemPath>
  33. </dependency>
  34. </dependencies>
  35. </code>
复制代码
  • 3. 在项目的src/main/resources目录下,新建一个文件,命名为“log4j.properties”
  1. <code class="prism language-java">log4j.rootLogger=INFO, stdout
  2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  3. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  4. log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
  5. log4j.appender.logfile=org.apache.log4j.FileAppender
  6. log4j.appender.logfile.File=target/spring.log
  7. log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
  8. log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
  9. </code>
复制代码

{tilte}-admin

2. 编写程序

2.1 编写Mapper类

  1. <code class="prism language-java">package com.buwenbuhuo.wordcount;
  2. import java.io.IOException;
  3. import org.apache.hadoop.io.IntWritable;
  4. import org.apache.hadoop.io.LongWritable;
  5. import org.apache.hadoop.io.Text;
  6. import org.apache.hadoop.mapreduce.Mapper;
  7. /**
  8. * @author 卜温不火
  9. * @create 2020-04-22 21:24
  10. * com.buwenbuhuo.wordcount - the name of the target package where the new class or interface will be created.
  11. * mapreduce0422 - the name of the current project.
  12. */
  13. public class WcMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
  14. Text k = new Text();
  15. IntWritable v = new IntWritable(1);
  16. @Override
  17. protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  18. // 1 获取一行
  19. String line = value.toString();
  20. // 2 切割
  21. String[] words = line.split(" ");
  22. // 3 输出
  23. for (String word : words) {
  24. k.set(word);
  25. context.write(k, v);
  26. }
  27. }
  28. }
  29. </code>
复制代码

2.2 编写Reducer类

  1. <code class="prism language-java">package com.buwenbuhuo.wordcount;
  2. import java.io.IOException;
  3. import org.apache.hadoop.io.IntWritable;
  4. import org.apache.hadoop.io.Text;
  5. import org.apache.hadoop.mapreduce.Reducer;
  6. /**
  7. * @author 卜温不火
  8. * @create 2020-04-22 21:24
  9. * com.buwenbuhuo.wordcount - the name of the target package where the new class or interface will be created.
  10. * mapreduce0422 - the name of the current project.
  11. */
  12. public class WcReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
  13. int sum;
  14. IntWritable v = new IntWritable();
  15. @Override
  16. protected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {
  17. // 1 累加求和
  18. sum = 0;
  19. for (IntWritable count : values) {
  20. sum += count.get();
  21. }
  22. // 2 输出
  23. v.set(sum);
  24. context.write(key,v);
  25. }
  26. }
  27. </code>
复制代码

2.3 编写Driver驱动类

  1. <code class="prism language-java">package com.buwenbuhuo.wordcount;
  2. import java.io.IOException;
  3. import org.apache.hadoop.conf.Configuration;
  4. import org.apache.hadoop.fs.Path;
  5. import org.apache.hadoop.io.IntWritable;
  6. import org.apache.hadoop.io.Text;
  7. import org.apache.hadoop.mapreduce.Job;
  8. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  9. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  10. /**
  11. * @author 卜温不火
  12. * @create 2020-04-22 21:24
  13. * com.buwenbuhuo.wordcount - the name of the target package where the new class or interface will be created.
  14. * mapreduce0422 - the name of the current project.
  15. */
  16. public class WcDriver {
  17. public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
  18. // 1 获取配置信息以及封装任务
  19. Configuration configuration = new Configuration();
  20. Job job = Job.getInstance(configuration);
  21. // 2 设置jar加载路径
  22. job.setJarByClass(WcDriver.class);
  23. // 3 设置map和reduce类
  24. job.setMapperClass(WcMapper.class);
  25. job.setReducerClass(WcReducer.class);
  26. // 4 设置map输出
  27. job.setMapOutputKeyClass(Text.class);
  28. job.setMapOutputValueClass(IntWritable.class);
  29. // 5 设置最终输出kv类型
  30. job.setOutputKeyClass(Text.class);
  31. job.setOutputValueClass(IntWritable.class);
  32. // 6 设置输入和输出路径
  33. FileInputFormat.setInputPaths(job, new Path(args[0]));
  34. FileOutputFormat.setOutputPath(job, new Path(args[1]));
  35. // 7 提交
  36. boolean result = job.waitForCompletion(true);
  37. System.exit(result ? 0 : 1);
  38. }
  39. }
  40. </code>
复制代码

2.4 运行

  • 1.但是如果现在直接运行得话,会出现如下错误:

{tilte}-admin

  • 2.这是因为缺少了原始文件和要输出的目录,这是我们可以通过下列方法进行解决
    {tilte}-admin

    {tilte}-admin
  • 3. 再次运行

成功的截图

{tilte}-admin

  • 4. 下面我们来看下运行的结果

打开进入并用Notepad++ 打开文件查看内容!发现统计的结果已经呈现在里面了!说明我们的程序运行成功了!

{tilte}-admin

过程梳理:
每读取一行数据,MapReduce就会调用一次map方法,在map方法中我们把每行数据用空格" "分隔成一个数组,遍历数组,把数组中的每一个元素作为key,1作为value作为map的输出传递给reduce。reduce把收集到的数据根据key值进行分区,把每个分区的内容进行单独计算,并把结果输出。


本次的分享就到这里了,受益的小伙伴们不要忘了点赞加关注呀,下一期博主将为大家继续带来MapReduce中如何打包jar包,并在集群上运行的博文,敬请期待。


本站资源均由网上搜集或网友上传提供,内容仅供观摩学习交流之用,本站将不对任何资源负法律责任.如有侵犯您的版权,请及时联系我们(邮箱:892481490@qq.com,客服QQ:892481490),我们会尽快处理!QQ350550790是骗子,注意不要和他交易!!!
发帖求助前要善用【论坛搜索】功能, 那里可能会有你要找的答案,也能为你节约不少学习时间;
如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加(威望)和(贡献)而不会扣除自己的积分。
如发现灌水帖、病毒木马帖、广告帖、工具不能正常使用、网盘链接失效,请点击【举报】 核实有几率会给予额外的B币奖励哦!
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    发布资源 快速回复 返回列表 客服中心 官方QQ群

    QQ|小黑屋|手机版|编程之家论坛 ( 桂ICP备18002029号 )

    Powered by 编程之家  © 20019-2021