MapReduce工作机制——Word Count实例(一)
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如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>WordCount</groupId>
<artifactId>Hadoop</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-common</artifactId>
<version>2.7.0</version>
</dependency>
</dependencies>
</project>
编码
Mapper类
Mapper类的4个泛型分别代表:map函数输入键值对的键的类,map函数输入键值对的值的类,map函数输出键值对的键的类,map函数输出键值对的值的类。
map函数部分,key是LongWritable类型,表示该行;value是Text类型,表示行的内容;Context类的write(Text key, IntWritable value)将中间结果输出。
package com.hellohadoop;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
import java.util.StringTokenizer;
/**
* Created by duyue on 2017/7/13.
*/
public class TokenizerMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
// 直接把单词的个数设置成1, 认为出现了1次
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
// 每行文本拆分成单个单词
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
// 每个单词(忽略重复)的个数都为1
// 即,出现两次"good"会写入两次"good",而不会认为"good"出现了2次
context.write(word, one);
}
}
}
Reducer类
Reducer类的4个泛型表示:reduce函数输入键值对的键的类,reduce函数输入键值对的值的类(与map函数输出对应),reduce函数输出键值对的键的类,reduce函数输出键值对的值的类。
reduce函数部分:接收到的参数形如:<key, List<value>>,因为map函数把key值相同(同一单词)的所有value都发送给reduce函数,统计后输出结果。
package com.hellohadoop;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
import java.util.Iterator;
/**
* Created by duyue on 2017/7/13.
*/
public class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
编写main函数
package com.hellohadoop;
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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
/**
* Created by duyue on 2017/7/13.
*/
public class WordCount {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
Job job = new Job(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.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);
}
}
运行程序
此处主要依赖于之前Maven依赖的包,为了成功显示日志文件,需要在resources包中添加log4j.properties文件,位置如下图:

文件配置:
log4j.rootLogger=debug, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=firestorm.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
log4j.logger.com.codefutures=DEBUG
配置Configuration如图:

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

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

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

以上就是Word Count实例在Idea下运行的情况
下期预告:MapReduce编程涉及到的API
MapReduce工作机制——Word Count实例(一)的更多相关文章
- hadoop MapReduce 工作机制
摸索了将近一个月的hadoop , 在centos上配了一个伪分布式的环境,又折腾了一把hadoop eclipse plugin,最后终于实现了在windows上编写MapReduce程序,在cen ...
- hadoop知识点总结(一)hadoop架构以及mapreduce工作机制
1,为什么需要hadoop 数据分析者面临的问题 数据日趋庞大,读写都出现性能瓶颈: 用户的应用和分析结果,对实时性和响应时间要求越来越高: 使用的模型越来越复杂,计算量指数级上升. 期待的解决方案 ...
- MapReduce06 MapReduce工作机制
目录 5 MapReduce工作机制(重点) 5.1 MapTask工作机制 5.2 ReduceTask工作机制 5.3 ReduceTask并行度决定机制 手动设置ReduceTask数量 测试R ...
- 浅谈MapReduce工作机制
1.MapTask工作机制 整个map阶段流程大体如上图所示.简单概述:input File通过getSplits被逻辑切分为多个split文件,通通过RecordReader(默认使用lineRec ...
- [hadoop读书笔记] 第五章 MapReduce工作机制
P205 MapReduce的两种运行机制 第一种:经典的MR运行机制 - MR 1 可以通过一个简单的方法调用来运行MR作业:Job对象上的submit().也可以调用waitForCompleti ...
- MapReduce工作机制
MapReduce是什么? MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,MapReduce程序本质上是并行运行的,因此可以解决海量数据的计算问题. MapReduce ...
- yarn/mapreduce工作机制及mapreduce客户端代码编写
首先需要知道的就是在老版本的hadoop中是没有yarn的,mapreduce既负责资源分配又负责业务逻辑处理.为了解耦,把资源分配这块抽了出来,形成了yarn,这样不仅mapreudce可以用yar ...
- MapReduce工作原理(简单实例)
Map-Reduce框架的运作完全基于<key,value>对,即数据的输入是一批<key,value>对,生成的结果也是一批<key,value>对,只是有时候它 ...
- 图文详解MapReduce工作机制
job提交阶段 1.准备好待处理文本. 2.客户端submit()前,获取待处理数据的信息,然后根据参数配置,形成一个任务分配的规划. 3.客户端向Yarn请求创建MrAppMaster并提交切片等相 ...
随机推荐
- javascript使用闭包模拟私有属性和方法
最近因为做了一个项目,其中涉及到了js私有方法,这个概念在其语言里面是很常见的,很多语言都有private这个关键字,只要在一个类的前面加上private就表示申明了一个私有方法,但是javascri ...
- 【xsy2140】计数
Time Limit: 1000 ms Memory Limit: 256 MB description 吐槽 所以说..组合数的题是不是都是知道大致思路但是就是不会写qwq菜醒qwq 正题 这题其实 ...
- java线程学习第一天__低配版的卖面包机
package Thread;import javax.xml.bind.ValidationEvent;class snacks{ private int SaledSnacks=0; ...
- README.md用法
简单说明常用标签 # 标题标签与h1~h6 相似 也有6个 = 高级标题标签 - 中标签 * 列表标签 与 <li> 标签相似 ` 实体标签,内容会换行 ``` 实体标签 内容保持编辑 ...
- 速成KeePass全局自动填表登录QQ与迅雷(包括中文输入法状态时用中文用户名一键登录)
原文:http://bbs.kafan.cn/thread-1637531-1-1.html 使用目的:1 网页和本地客户端登录一站式解决2 通过KeePss修改密码和登录更方便,可以复制粘贴,省了输 ...
- redis's usage
author:headsen chen date:2017-12-07 16:33:40 notice:This article is created by headsen chen ,and n ...
- Redis 学习相关的网站
Redis 命令参考 http://doc.redisfans.com/ https://redis.io/commands http://www.redis.net.cn Redis教程 http: ...
- PHP面试和PHP开发者都应掌握的10个问题
PHP面试和PHP开发者都应掌握的10个问题 问题 :1 MySQL里的存储引擎有什么不同,哪一个是默认的? 答案: 1 我们可以一下存储引擎: 1. MyISAM(MySQL的默认引擎. 每个MyI ...
- CentOS7.2下Nginx的使用
Nginx的启动 指定配置文件的方式启动 nginx -c /etc/nginx/nginx.conf 对于yum安装的nginx,使用systemctl命令启动 systemctl start ng ...
- 学习资料分享(Java第一行代码视频)<susmote.com>
17年买了一本书,第一行代码(JAVA),李兴华编写的. 一开始我是按照书本一页一页的啃,一个点一个点的去学,虽然当时学的有些枯燥,但里面的知识点大部分还是弄的懂,只是一次偶然,因为有点质疑书上写的( ...