MapReduce工作机制——Word Count实例(一)

MapReduce的思想是分布式计算,也就是分而治之,并行计算提高速度。

编程思想

首先,要将数据抽象为键值对的形式,map函数输入键值对,处理后,产生新的键值对作为中间结果输出。接着,MapReduce框架自动将中间结果按键做聚合处理,发给reduce函数处理。最后,reduce函数以键和对应的值的集合作为输入,处理后,产生另一系列键值对作为最终输出。后面会结合实例介绍整个过程。

运行环境

先不考虑采用YARN的情况,那个时候MapReduce的运行环境就是YARN,此处我们讨论的是上一代环境。

TaskTracker

slave的角色,负责汇报心跳和执行命令。一个集群有多个TaskTracker,但一个节点只有一个,TaskTracker和DataNode运行在同一节点。

JobTracker

master的角色,负责任务调度和集群资源监控,不参与计算。根据TaskTracker周期性发来的心跳信息,考虑TaskTracker的资源剩余量、作业优先级等等,为其分配合适的任务。

Word Count实例

环境

  • Java 1.7
  • Hadoop 2.7
  • Maven 3.3
  • Intellij IDEA 2016.3
  • Windows 10

题主在集成开发环境下写了Word Count程序,配置的pom.xml如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>WordCount</groupId>
  7. <artifactId>Hadoop</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <dependencies>
  10. <dependency>
  11. <groupId>org.apache.hadoop</groupId>
  12. <artifactId>hadoop-common</artifactId>
  13. <version>2.7.0</version>
  14. </dependency>
  15. <dependency>
  16. <groupId>org.apache.hadoop</groupId>
  17. <artifactId>hadoop-mapreduce-client-core</artifactId>
  18. <version>2.7.0</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.apache.hadoop</groupId>
  22. <artifactId>hadoop-mapreduce-client-common</artifactId>
  23. <version>2.7.0</version>
  24. </dependency>
  25. </dependencies>
  26. </project>

编码

Mapper类

Mapper类的4个泛型分别代表:map函数输入键值对的键的类,map函数输入键值对的值的类,map函数输出键值对的键的类,map函数输出键值对的值的类。

map函数部分,key是LongWritable类型,表示该行;value是Text类型,表示行的内容;Context类的write(Text key, IntWritable value)将中间结果输出。

  1. package com.hellohadoop;
  2. import org.apache.hadoop.io.IntWritable;
  3. import org.apache.hadoop.io.LongWritable;
  4. import org.apache.hadoop.io.Text;
  5. import org.apache.hadoop.mapreduce.Mapper;
  6. import java.io.IOException;
  7. import java.util.StringTokenizer;
  8. /**
  9. * Created by duyue on 2017/7/13.
  10. */
  11. public class TokenizerMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
  12. // 直接把单词的个数设置成1, 认为出现了1次
  13. private final static IntWritable one = new IntWritable(1);
  14. private Text word = new Text();
  15. public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  16. // 每行文本拆分成单个单词
  17. StringTokenizer itr = new StringTokenizer(value.toString());
  18. while (itr.hasMoreTokens()) {
  19. word.set(itr.nextToken());
  20. // 每个单词(忽略重复)的个数都为1
  21. // 即,出现两次"good"会写入两次"good",而不会认为"good"出现了2次
  22. context.write(word, one);
  23. }
  24. }
  25. }

Reducer类

Reducer类的4个泛型表示:reduce函数输入键值对的键的类,reduce函数输入键值对的值的类(与map函数输出对应),reduce函数输出键值对的键的类,reduce函数输出键值对的值的类。

reduce函数部分:接收到的参数形如:<key, List<value>>,因为map函数把key值相同(同一单词)的所有value都发送给reduce函数,统计后输出结果。

  1. package com.hellohadoop;
  2. import org.apache.hadoop.io.IntWritable;
  3. import org.apache.hadoop.io.Text;
  4. import org.apache.hadoop.mapreduce.Reducer;
  5. import java.io.IOException;
  6. import java.util.Iterator;
  7. /**
  8. * Created by duyue on 2017/7/13.
  9. */
  10. public class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
  11. private IntWritable result = new IntWritable();
  12. public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
  13. int sum = 0;
  14. for (IntWritable val : values) {
  15. sum += val.get();
  16. }
  17. result.set(sum);
  18. context.write(key, result);
  19. }
  20. }

编写main函数

  1. package com.hellohadoop;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.Path;
  4. import org.apache.hadoop.io.IntWritable;
  5. import org.apache.hadoop.io.Text;
  6. import org.apache.hadoop.mapreduce.Job;
  7. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  8. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  9. import java.io.IOException;
  10. /**
  11. * Created by duyue on 2017/7/13.
  12. */
  13. public class WordCount {
  14. public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
  15. Configuration conf = new Configuration();
  16. Job job = new Job(conf, "word count");
  17. job.setJarByClass(WordCount.class);
  18. job.setMapperClass(TokenizerMapper.class);
  19. job.setReducerClass(IntSumReducer.class);
  20. job.setOutputKeyClass(Text.class);
  21. job.setOutputValueClass(IntWritable.class);
  22. FileInputFormat.addInputPath(job, new Path(args[0]));
  23. FileOutputFormat.setOutputPath(job, new Path(args[1]));
  24. System.exit(job.waitForCompletion(true) ? 0 : 1);
  25. }
  26. }

运行程序

此处主要依赖于之前Maven依赖的包,为了成功显示日志文件,需要在resources包中添加log4j.properties文件,位置如下图:

文件配置:

  1. log4j.rootLogger=debug, stdout, R
  2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  3. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  4. log4j.appender.stdout.layout.ConversionPattern=%5p - %m%n
  5. log4j.appender.R=org.apache.log4j.RollingFileAppender
  6. log4j.appender.R.File=firestorm.log
  7. log4j.appender.R.MaxFileSize=100KB
  8. log4j.appender.R.MaxBackupIndex=1
  9. log4j.appender.R.layout=org.apache.log4j.PatternLayout
  10. log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
  11. log4j.logger.com.codefutures=DEBUG

配置Configuration如图:

自己要创建input文件夹,并将在Project Structure中设置为Excluded类型。在input文件夹下创建需要统计单词数的文件,位置如下图:

题主统计的是莎士比亚有名的十四行诗的Sonnet 18,运行程序后:

其中part-r-00000中保存了统计结果,图太长,截了一部分:

以上就是Word Count实例在Idea下运行的情况

下期预告:MapReduce编程涉及到的API

MapReduce工作机制——Word Count实例(一)的更多相关文章

  1. hadoop MapReduce 工作机制

    摸索了将近一个月的hadoop , 在centos上配了一个伪分布式的环境,又折腾了一把hadoop eclipse plugin,最后终于实现了在windows上编写MapReduce程序,在cen ...

  2. hadoop知识点总结(一)hadoop架构以及mapreduce工作机制

    1,为什么需要hadoop 数据分析者面临的问题 数据日趋庞大,读写都出现性能瓶颈: 用户的应用和分析结果,对实时性和响应时间要求越来越高: 使用的模型越来越复杂,计算量指数级上升. 期待的解决方案 ...

  3. MapReduce06 MapReduce工作机制

    目录 5 MapReduce工作机制(重点) 5.1 MapTask工作机制 5.2 ReduceTask工作机制 5.3 ReduceTask并行度决定机制 手动设置ReduceTask数量 测试R ...

  4. 浅谈MapReduce工作机制

    1.MapTask工作机制 整个map阶段流程大体如上图所示.简单概述:input File通过getSplits被逻辑切分为多个split文件,通通过RecordReader(默认使用lineRec ...

  5. [hadoop读书笔记] 第五章 MapReduce工作机制

    P205 MapReduce的两种运行机制 第一种:经典的MR运行机制 - MR 1 可以通过一个简单的方法调用来运行MR作业:Job对象上的submit().也可以调用waitForCompleti ...

  6. MapReduce工作机制

    MapReduce是什么? MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,MapReduce程序本质上是并行运行的,因此可以解决海量数据的计算问题. MapReduce ...

  7. yarn/mapreduce工作机制及mapreduce客户端代码编写

    首先需要知道的就是在老版本的hadoop中是没有yarn的,mapreduce既负责资源分配又负责业务逻辑处理.为了解耦,把资源分配这块抽了出来,形成了yarn,这样不仅mapreudce可以用yar ...

  8. MapReduce工作原理(简单实例)

    Map-Reduce框架的运作完全基于<key,value>对,即数据的输入是一批<key,value>对,生成的结果也是一批<key,value>对,只是有时候它 ...

  9. 图文详解MapReduce工作机制

    job提交阶段 1.准备好待处理文本. 2.客户端submit()前,获取待处理数据的信息,然后根据参数配置,形成一个任务分配的规划. 3.客户端向Yarn请求创建MrAppMaster并提交切片等相 ...

随机推荐

  1. java中数组复制的两种方式

    在java中数组复制有两种方式: 一:System.arraycopy(原数组,开始copy的下标,存放copy内容的数组,开始存放的下标,需要copy的长度); 这个方法需要先创建一个空的存放cop ...

  2. 常见递归问题 java

    //最长公共子序列 import java.util.*;public class Main { public static void main(String[] args){ int ans = m ...

  3. 【解高次同余方程】51nod1038 X^A Mod P

    1038 X^A Mod P 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 X^A mod P = B,其中P为质数.给出P和A B,求< P的所有X. 例如:P = 11 ...

  4. Jersey+mybatis实现web项目第一篇

    ---恢复内容开始--- Jesery第一篇:实现Jesery前后台页面交互,Form表单提交,后台控制页面跳转 该项目中有实现的功能: Mybatis实现后台数据持久化 Jersey页面数据提交 后 ...

  5. MongoDB起步

    1.Mongodb基本概念和SQL的区别:SQL术语        MongoDB术语database    databasetable        collectionrow        doc ...

  6. Firefox配置文件夹详解

    参考此文会帮助你更好的管理和备份Firefox配置文件,此文没有列出的文件大多是Firefox运行时生成的一些随机文件,大多无用,备份或管理配置文件时酌情删除. 在地址栏输入about:support ...

  7. python笔记之异常

    异常 內建异常在exceptions模块内,使用dir函数列出模块的内容. 自定义异常类:继承基类Exception. 异常可以使用raise语句引发,可以使用try ... except ... e ...

  8. 在Ubuntu下如何切换到超级用户

    由于 Ubuntu 是基于 Debian 的 linux 操作系统,在默认的情况下,是没有超级用户(superuser, root)的,但有些系统操作必须有超级用户的权限才能进行,如手动释放内存等. ...

  9. java实现单链表的增删功能

    JAVA 实现单链表的增删功能 package linked; class LinkedTable{ } public class LinkedTableTest { public static vo ...

  10. Oracle查询优化改写--------------------操作多个表

    一.union all与空字符串 二.组合相关行 三.in .exists.inter join .left join .right join .full join 之间的区别 'inner  joi ...