MapReduce概述
MapReduce定义
MapReduce优缺点
优点
缺点
MapReduce核心思想
- 1)分布式的运算程序往往需要分成至少2个阶段。
- 2)第一个阶段的MapTask并发实例,完全并行运行,互不相干。
- 3)第二个阶段的ReduceTask并发实例互不相干,但是他们的数据依赖于上一个阶段的所有MapTask并发实例的输出。
- 4)MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行。
- 总结:分析WordCount数据流走向深入理解MapReduce核心思想。
MapReduce进程
官方WordCount源码
用反编译工具反编译源码,发现WordCount案例有Map类、Reduce类和驱动类。且数据的类型是Hadoop自身封装的序列化类型。
常用数据序列化类型
常用的数据类型对应的Hadoop数据序列化类型Java类型 | Hadoop Writable类型 |
---|---|
boolean | BooleanWritable |
byte | ByteWritable |
int | IntWritable |
float | FloatWritable |
long | LongWritable |
double | DoubleWritable |
String | Text |
map | MapWritable |
array | ArrayWritable |
MapReduce编程规范
用户编写的程序分成三个部分:Mapper、Reducer和Driver。
WordCount案列实操
需求
在给定的文本文件中统计输出每一个单词出现的总次数
- 输入数据(hello.txt)
1 | atyp atyp |
- 期望输出数据
1 | atyp 2 |
需求分析
按照MapReduce编程规范,分别编写Mapper,Reducer,Driver
环境准备
- 创建maven工程(mr-0529)
- 在pom.xml文件中添加如下依赖
1 | <dependencies> |
- 在项目的src/main/resources目录下,新建一个文件,命名为“log4j.properties”,在文件中填入。
1 | log4j.rootLogger=INFO, stdout |
编写程序
- 编写Mapper类
1 | package com.atyp.mr.wordcount; |
- 编写Reducer类
1 | package com.atyp.mr.wordcount; |
注意:这里reducer阶段的前两个泛型是map阶段输出的k和v
- 编写Driver驱动类
1 | package com.atyp.mr.wordcount; |
本地测试
集群上测试
- 用maven打jar包,需要添加的打包插件依赖
1 | <build> |
注意:全类名
- 将程序打成jar包,然后拷贝到Hadoop集群中
- 启动Hadoop集群
- 执行WordCount程序