MapReduce编程模型
课程目标
- 理解基本术语,比如:MapReduce、Combiner、Partitioner、Shuffle等
- 理解MapReduce编程模型,掌握用MapReduce开发并行程序
- 理解MapReduce高级功能/组件、工作机制
- 掌握采用MapReduce常用案例及解决方法,学以致用
1.1MapReduce定义
MapReduce是一种简化并行计算的编程模型,用于进行大数据量的计算。
MapReduce是一个分布式运行编程的编程框架,使用户开发“基于Hadoop的数据分析应用”的核心框架。
1.2MapReduce优缺点
一.优点:易于编程,良好的扩展性,高容错性,擅长对PB级以上海量数据进行离线处理。
解释:
(1) 易于编程:它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分不到大量廉价的PC机器上运行。也就是说你写一个分布式程序,就写一个简单的串行程序一模一样的。就是因为这个特点使得MapReduce编程变得流行起来。
(2) 良好的扩展性:当你的计算机资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。
(3) 高容错性:MapReduce设计的初衷就是使程序能够部署在廉价的PC机器上,就是要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而且全是由hadoop内部完成的。
(4)擅长对PB级以上的海量数据进行离线处理:可以实现上千台服务器集群并发工作,提供数据处理能力。
二.缺点:不擅长实时计算,不擅长流式计算,不擅长DAG(有向图)计算
(1)不擅长实时计算:MapReduce无法像MySQL一样,在毫秒或者很短的时间内返回结果。
(2)不擅长流式计算:流式计算的输入数据是动态的,而且MapReduce的输入数据集是静态的,不能动态变化。就是因为MapReduce自身的设计特点决定了数据源必须是静态的。
(3)不擅长DAG(有向图)计算:多个应用程序存在一定的依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce并不是不能做,二十使用后每个MapReduce作业的输出都会写入磁盘,会造成大量的磁盘IO,导致性能非常的低下。
1.3MapReduce进程
一个完整的MapReduce进程在分布式运算时有三类实列进程:
(1)MrAppMaster:负责整个程序的过程跳读以及状态协调。
(2)MapTask:负责Map阶段的整个数据处理流程。
(3)ReduceTask:负责Reduce阶段的整个数据流程。
Java类型 | Hadoop Writable类型 |
Boolean | BooleanWritable |
Byte | ByteWritable |
Int | IntWritable |
Float | FloatWritable |
Long | LongWritable |
Double | DoubleWritable |
String | Text |
Map | MapWritable |
Array | ArrayWritable |
1.5MapReduce编程规范
1.Mapper阶段
(1)用户自定义的Mapper要继承自己的父类
(2)Mapper的输入数据是kv对的形式(kv的类型是自定义)
(3)Mapper中业务逻辑写在map()方法中
(4)Mapper的输出数据是kv对的形式(kv的类型可以自定义)
(5)map()方法(MapTaask进程)对每一个<k,v>调用一次
2.Reducer阶段
(1)用户自定义的Reducer要继承自己的父类
(2)Reducer的输入数据类型对应的是Mapper的输出数据类型,也是kv
(3)Reducer的业务逻辑写在reduce()方法中
(4)ReduceTask进程对每一组相同的k的<k,v>组调用一次reducce()方法
3.Driver阶段
相当于YARN集群的客户端,用于体骄傲我们整个程序到Yarn集群,提交的是封装了MapReduce程序相关运行参数的job对象
1.6WordCount案例操作
1.需求
给定文本文件,统计文本文件中单词的个数,输出每个单词出现的总次数
(1)输入数据
I am somebody
I am smart and kind
I am important
I am starve of education
I have places to go
I have people to impress
I have world to change
(2)输出数据
2.需求分析
Mapper部分
输入(0,I am somebody)k1=0,v1="I am somebody"
<,I am smart and kind>
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | ||||||
I | a | m | s | o | m | e | b | o | d | y | 换行符 |
3.1将MapTask传给我们的文本内容先转成String
3.2根据空格将这一行切分成单词
I
am
somebody
3.3将单词输出为<单词,1>k2
<I,1>
<am,1>
<somebody,1>