Hadoop框架:MapReduce基本原理和入门案例
本文源码:GitHub·点这里 || GitEE·点这里
一、MapReduce概述
1、基本概念
Hadoop核心组件之一:分布式计算的方案MapReduce,是一种编程模型,用于大规模数据集的并行运算,其中Map(映射)和Reduce(归约)。
MapReduce既是一个编程模型,也是一个计算组件,处理的过程分为两个阶段,Map阶段:负责把任务分解为多个小任务,Reduce负责把多个小任务的处理结果进行汇总。其中Map阶段主要输入是一对Key-Value,经过map计算后输出一对Key-Value值;然后将相同Key合并,形成Key-Value集合;再将这个Key-Value集合转入Reduce阶段,经过计算输出最终Key-Value结果集。
2、特点描述
MapReduce可以实现基于上千台服务器并发工作,提供很强大的数据处理能力,如果其中单台服务挂掉,计算任务会自动转义到另外节点执行,保证高容错性;但是MapReduce不适应于实时计算与流式计算,计算的数据是静态的。
二、操作案例
1、流程描述

数据文件一般以CSV格式居多,数据行通常以空格分隔,这里需要考虑数据内容特点;
文件经过切片分配在不同的MapTask任务中并发执行;
MapTask任务执行完毕之后,执行ReduceTask任务,依赖Map阶段的数据;
ReduceTask任务执行完毕后,输出文件结果。
2、基础配置
hadoop:
# 读取的文件源
inputPath: hdfs://hop01:9000/hopdir/javaNew.txt
# 该路径必须是程序运行前不存在的
outputPath: /wordOut
3、Mapper程序
public class WordMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
Text mapKey = new Text();
IntWritable mapValue = new IntWritable(1);
@Override
protected void map (LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
// 1、读取行
String line = value.toString();
// 2、行内容切割,根据文件中分隔符
String[] words = line.split(" ");
// 3、存储
for (String word : words) {
mapKey.set(word);
context.write(mapKey, mapValue);
}
}
}
4、Reducer程序
public class WordReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
int sum ;
IntWritable value = new IntWritable();
@Override
protected void reduce(Text key, Iterable<IntWritable> values,Context context)
throws IOException, InterruptedException {
// 1、累加求和统计
sum = 0;
for (IntWritable count : values) {
sum += count.get();
}
// 2、输出结果
value.set(sum);
context.write(key,value);
}
}
5、执行程序
@RestController
public class WordWeb {
@Resource
private MapReduceConfig mapReduceConfig ;
@GetMapping("/getWord")
public String getWord () throws IOException, ClassNotFoundException, InterruptedException {
// 声明配置
Configuration hadoopConfig = new Configuration();
hadoopConfig.set("fs.hdfs.impl",
org.apache.hadoop.hdfs.DistributedFileSystem.class.getName()
);
hadoopConfig.set("fs.file.impl",
org.apache.hadoop.fs.LocalFileSystem.class.getName()
);
Job job = Job.getInstance(hadoopConfig);
// Job执行作业 输入路径
FileInputFormat.addInputPath(job, new Path(mapReduceConfig.getInputPath()));
// Job执行作业 输出路径
FileOutputFormat.setOutputPath(job, new Path(mapReduceConfig.getOutputPath()));
// 自定义 Mapper和Reducer 两个阶段的任务处理类
job.setMapperClass(WordMapper.class);
job.setReducerClass(WordReducer.class);
// 设置输出结果的Key和Value的类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//执行Job直到完成
job.waitForCompletion(true);
return "success" ;
}
}
6、执行结果查看
将应用程序打包放到hop01服务上执行;
java -jar map-reduce-case01.jar

三、案例分析
1、数据类型
Java数据类型与对应的Hadoop数据序列化类型;
| Java类型 | Writable类型 | Java类型 | Writable类型 |
|---|---|---|---|
| String | Text | float | FloatWritable |
| int | IntWritable | long | LongWritable |
| boolean | BooleanWritable | double | DoubleWritable |
| byte | ByteWritable | array | DoubleWritable |
| map | MapWritable |
2、核心模块
Mapper模块:处理输入的数据,业务逻辑在map()方法中完成,输出的数据也是KV格式;
Reducer模块:处理Map程序输出的KV数据,业务逻辑在reduce()方法中;
Driver模块:将程序提交到yarn进行调度,提交封装了运行参数的job对象;
四、序列化操作
1、序列化简介
序列化:将内存中对象转换为二进制的字节序列,可以通过输出流持久化存储或者网络传输;
反序列化:接收输入字节流或者读取磁盘持久化的数据,加载到内存的对象过程;
Hadoop序列化相关接口:Writable实现的序列化机制、Comparable管理Key的排序问题;
2、案例实现
案例描述:读取文件,并对文件相同的行做数据累加计算,输出计算结果;该案例演示在本地执行,不把Jar包上传的hadoop服务器,驱动配置一致。
实体对象属性
public class AddEntity implements Writable {
private long addNum01;
private long addNum02;
private long resNum;
// 构造方法
public AddEntity() {
super();
}
public AddEntity(long addNum01, long addNum02) {
super();
this.addNum01 = addNum01;
this.addNum02 = addNum02;
this.resNum = addNum01 + addNum02;
}
// 序列化
@Override
public void write(DataOutput dataOutput) throws IOException {
dataOutput.writeLong(addNum01);
dataOutput.writeLong(addNum02);
dataOutput.writeLong(resNum);
}
// 反序列化
@Override
public void readFields(DataInput dataInput) throws IOException {
// 注意:反序列化顺序和写序列化顺序一致
this.addNum01 = dataInput.readLong();
this.addNum02 = dataInput.readLong();
this.resNum = dataInput.readLong();
}
// 省略Get和Set方法
}
Mapper机制
public class AddMapper extends Mapper<LongWritable, Text, Text, AddEntity> {
Text myKey = new Text();
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
// 读取行
String line = value.toString();
// 行内容切割
String[] lineArr = line.split(",");
// 内容格式处理
String lineNum = lineArr[0];
long addNum01 = Long.parseLong(lineArr[1]);
long addNum02 = Long.parseLong(lineArr[2]);
myKey.set(lineNum);
AddEntity myValue = new AddEntity(addNum01,addNum02);
// 输出
context.write(myKey, myValue);
}
}
Reducer机制
public class AddReducer extends Reducer<Text, AddEntity, Text, AddEntity> {
@Override
protected void reduce(Text key, Iterable<AddEntity> values, Context context)
throws IOException, InterruptedException {
long addNum01Sum = 0;
long addNum02Sum = 0;
// 处理Key相同
for (AddEntity addEntity : values) {
addNum01Sum += addEntity.getAddNum01();
addNum02Sum += addEntity.getAddNum02();
}
// 最终输出
AddEntity addRes = new AddEntity(addNum01Sum, addNum02Sum);
context.write(key, addRes);
}
}
案例最终结果:

五、源代码地址
GitHub·地址
https://github.com/cicadasmile/big-data-parent
GitEE·地址
https://gitee.com/cicadasmile/big-data-parent
推荐阅读:编程体系整理
| 序号 | 项目名称 | GitHub地址 | GitEE地址 | 推荐指数 |
|---|---|---|---|---|
| 01 | Java描述设计模式,算法,数据结构 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ |
| 02 | Java基础、并发、面向对象、Web开发 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆ |
| 03 | SpringCloud微服务基础组件案例详解 | GitHub·点这里 | GitEE·点这里 | ☆☆☆ |
| 04 | SpringCloud微服务架构实战综合案例 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ |
| 05 | SpringBoot框架基础应用入门到进阶 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆ |
| 06 | SpringBoot框架整合开发常用中间件 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ |
| 07 | 数据管理、分布式、架构设计基础案例 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ |
| 08 | 大数据系列、存储、组件、计算等框架 | GitHub·点这里 | GitEE·点这里 | ☆☆☆☆☆ |
Hadoop框架:MapReduce基本原理和入门案例的更多相关文章
- Hadoop基础-MapReduce的Partitioner用法案例
Hadoop基础-MapReduce的Partitioner用法案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Partitioner关键代码剖析 1>.返回的分区号 ...
- Hadoop基础-MapReduce的Combiner用法案例
Hadoop基础-MapReduce的Combiner用法案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编写年度最高气温统计 如上图说所示:有一个temp的文件,里面存放 ...
- 分布式计算框架-MapReduce 基本原理(MP用于分布式计算)
hadoop最主要的2个基本的内容要了解.上次了解了一下HDFS,本章节主要是了解了MapReduce的一些基本原理. MapReduce文件系统:它是一种编程模型,用于大规模数据集(大于1TB)的并 ...
- Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码
Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本文主要是记录一写我在学习MapReduce时的一些 ...
- Hadoop MapReduce编程 API入门系列之挖掘气象数据版本2(十)
下面,是版本1. Hadoop MapReduce编程 API入门系列之挖掘气象数据版本1(一) 这篇博文,包括了,实际生产开发非常重要的,单元测试和调试代码.这里不多赘述,直接送上代码. MRUni ...
- Hadoop 三剑客之 —— 分布式计算框架 MapReduce
一.MapReduce概述 二.MapReduce编程模型简述 三.combiner & partitioner 四.MapReduce词频统计案例 4.1 项目简介 ...
- Hadoop 学习之路(三)—— 分布式计算框架 MapReduce
一.MapReduce概述 Hadoop MapReduce是一个分布式计算框架,用于编写批处理应用程序.编写好的程序可以提交到Hadoop集群上用于并行处理大规模的数据集. MapReduce作业通 ...
- Hadoop 系列(三)—— 分布式计算框架 MapReduce
一.MapReduce概述 Hadoop MapReduce 是一个分布式计算框架,用于编写批处理应用程序.编写好的程序可以提交到 Hadoop 集群上用于并行处理大规模的数据集. MapReduce ...
- Hadoop 新 MapReduce 框架 Yarn 详解【转】
[转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/] 简介: 本文介绍了 Hadoop 自 0.23.0 版本 ...
随机推荐
- centos6.8 Mysql5.6.22 升级 mysql-5.7.20
一.检查系统环境 二.备份数据库 mysqldump –all-databases > allbackupfile.sql (建议:有条件的话可使用图形化界面备份,操作灵活) 三.下载安装文件 ...
- css变量复用 全局变量-局部变量
前言 简单使用场景:同一套后台系统有多套主题的情况下,主题色作为一个最常用到的可复用的颜色,非常有必要像js的全局变量一样存在全局变量中以作复用,之前我第一个想到的是sass的变量声明,未曾想到css ...
- 使用浏览器抓取QQ音乐接口(排行榜篇)
前言 最近手头比较空闲,再加上看到其他人的博客都差不多有个类似的播放控件,手就会闲不下来,说干就干,所以我们开始吧! 来到QQ音乐的官网,我们就直奔着目标去,寻找排行榜 我们主要用的是最近比较热的歌, ...
- Unity-根据时间开灯与关灯
声明:本人只是学生,并且只是自学Unity,如有大神,不喜勿喷,不足之处,请指出! 本项目使用了UniStorm 3.0(天气)插件,时间也是调用它本身的API,实际并不影响,用系统的时间的是也是可以 ...
- 在 Istio 中实现 Redis 集群的数据分片、读写分离和流量镜像
Redis 是一个高性能的 key-value 存储系统,被广泛用于微服务架构中.如果我们想要使用 Redis 集群模式提供的高级特性,则需要对客户端代码进行改动,这带来了应用升级和维护的一些困难.利 ...
- Vue 父子组件通信入门
父组件向子组件传值 1.组件实例定义方式,注意:子组件一定要使用props属性来定义父组件传递过来的数据 <script type="text/javascript"> ...
- chrome浏览器中调试窗口位置修改
在这里修改就好了
- 对于类似经销商的实体中Place(CBM_PALCE_ID = NULL)的情况,如何获取省市信息(限foton)
在库里像上述描述的数据很多,这种情况需要拿fence里的经纬度,反查省市 String[] strArr = data.getFence().getValue().split(";" ...
- Linux下如何使用X86 CPU的GPIO
目录 1.前言 2.linux pinctrl子系统 3. pin controller driver 4.手动构造device 1.前言 在arm嵌入式开发中,各个外设具有固定的物理地址,我们可以直 ...
- LoRa技术的发展应用和LoRa应用设备
LoRa技术的发展应用 LORA技术大约在十年前由法国和瑞士开发,到现今LORA技术已经是物联网发展应用中不可缺少的一部分,根据中国物联网研究与发展中心的数据,2025年我国物联网产业规模将达到2万亿 ...