MapReduce入门
MapReduce入门
前言:
MapReduce 是一个分布式运算程序的编程框架,核心功能是将用户编写的逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在Hadoop集群上。
MapReduce 思想核心是"分而治之",适用于大量复杂的任务处理场景。
Map负责"分",即把复杂的任务分解为若干个"简单的任务"来并行处理。可以进行拆分的前提是这些小人物可以并行计算,彼此之间几乎没有依赖关系。
Reduce负责"合",即对mao阶段的结果进行全局汇总。
一、为什么要用MapReduce
1)海量数据在单机上处理,因为硬件资源限制,无法胜任,需要采用分布式集群的方法来处理
2)而一旦将单机版程序扩展到集群来分布式运行,将极大地增加程序的复杂度和开发难度
3)引入MapReduce框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理。
二、MapReduce 框架结构
一个完整的 MapReduce 程序在分布式运行时有三类实例进程:
1. MRAppMaster:负责整个程序的过程调度及状态协调
2. MapTask:负责 map 阶段的整个数据处理流程
3. ReduceTask:负责 Reduce 阶段的整个数据处理流程
三、MapReduce 编程规范(一)
MapReduce 的开发一共有八个步骤其中map阶段分为2个步骤
● 用户程序会分成三个部分:Mapper,Reducer,Driver
● Mapper 的输入、输出数据都是 KV 对的形式,KV 的类型可以设置
● Mapper 中的业务逻辑写在 map 方法中
● map 方法是每进来一个 KV 对调用一次
● Reduce 的输入数据应该对应 Mapper 的输出数据,也是 KV 对的形式
● Reduce 的业务逻辑写在 reduce 方法中
● Reduce 方法是对每一个< key,valuesList >调用一次
● 用户的 Mapper 和 Reduce 都要继承各自的父类
● 整个程序需要一个 Driver 来进行提交,提交的是一个描述了各种必要信息的 job 对象
四、MapReduce 编程规范(二)
MapReduce的开发一共有八个步骤其中map阶段分为2个步骤,shuffle阶段4个步骤,reduce阶段分为2个步骤
● Map 阶段2个步骤
第一步:设置inputFormat类,将我们的数据切分成key,value对,输入到第二步
第二步:自定义map逻辑,处理第一步的输入数据,然后传换成新的key,value对输出
● shuffle 阶段4个步骤(可以全部不用管)
第三步:对输出的key,value对进行分区
第四步:对不同分区的数据按照相同的key进行排序
第五步:对分组后的数据进行规约(Combine操作),降低数据的网络拷贝(可选步骤)
第六步:对排序后的额数据进行分组,分组的过程中,将相同key的value放到一个集合当中
● Reduce 阶段2个步骤
第七步:对多个map的任务进行合并,排序,写reduce函数自己的逻辑,对输入的key,value对进行处理,转换成新的key,value对进行输出
第八步:设置outputFormat类将输出的key,value对数据进行保存到文件中
五、MapReduce 程序运行模式
1)本地运行模式
● MapReduce 程序是被提交给 LocalJobRunner 在本地以单进程的形式运行
● 而处理的数据及输出结果可以在本地文件系统,也可以在 HDFS 上
2)集群运行模式
● MapReduce 程序会提交给 yarn 集群的 resourcemanager,分发到很多的节点上并发执行
● 处理的数据和输出结果应该位于 HDFS 文件系统
六、MapReduce 中的 Combiner
● Combiner 是 MR 程序中 Mapper 和 Reducer 之外的一种组件
● Combiner 组件的父类就是 Reducer
● Combiner 和 Reducer 的区别在于运行的位置:
Combinner 是在每一个 maptask 所在的节点运行
Reducer 是接收全局所有 Mapper 的输出结果;