MapReduce详解

来源:互联网 发布:c语言笔试题选择题 编辑:程序博客网 时间:2024/06/07 18:22

目标:

掌握MapReduce分布式运算框架的编程思想

掌握MapReduce常用算法的编程套路

掌握MapReduce分布式运算框架的运行机制,具备一定的自定义开发能力


1、MapReduce是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上。

2、为什么要用MapRedcue

A.海量数据在单机上处理因为硬件资源限制,无法胜任

B.而一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度

C.引入MapReduce框架后,将分布式程序中的公共功能封装成框架,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理

3、MapReduce的框架结构:

一个完整的MapReduce程序在分布式运行时有三类实例进程:

A.MRAppMaster(MapReduce Application Master):负责整个程序的过程调度及状态协调

B.MapTask:负责map阶段的整个数据处理流程

C.ReduceTask:负责reduce阶段的整个数据处理流程

4、MR程序运行流程

A.一个MR程序启动的时候,最先启动的是MRAppMaster,MRAppMaster启动后根据本次job的描述信息,计算出需要的maptask实例数量,然后向集群申请机器启动响应数量的maptask进程。

B.mapTask进程启动之后,根据给定的数据切片范围进行数据处理,主体流程为:

    a)利用客户指定的inputformat来获取RecordReader读取数据,形成输入KV对

    b)将输入的KV对传递给客户定义的map()方法,做逻辑运算,并将map()方法输出的KV对收集到缓存

    c)将缓存中的KV对按照K分区排序后不断溢出写到磁盘文件

C.MRAppMaster监控到所有maptask进程完成任务之后,会根据客户指定的参数启动相应数量的reduceTask进程,并告知reduceTask进程要处理的数据范围(数据分区)

D.ReduceTask进程启动后,根据MRAppMaster告知的待处理数据所在位置,从若干台maptask运行所在机器上获取到若干个mapmask输出结果文件,并在本地进行重新归并排序,然后按照相同的key的KV为一组,调用客户定义的reduce()方法进行逻辑运算,并收集运算输出的结果KV,然后调用客户指定的outputformat将结果输出到外部存储。

5、MapReduce原理--shuffle机制

mapreduce中,map阶段处理的数据如何传递给reduce阶段,是mapreduce框架最关键的一个流程,这个流程叫shuffle

shuffle:洗牌、发牌--(核心机制:数据分区,排序,缓存)

具体来说,就是将maptask输出的处理结果,分发给reducetask,并在分发的过程中,对数据按key进行了分区和排序。

shuffle处理流程:

shuffle具体流程:

A.mapMask收集map()方法输出的kv对,放到内存缓冲区中

B.从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件

C.多个溢出文件会被合并成大的溢出文件

D.在溢出过程及合并的过程中,都要调用partitioner进行分组和针对key进行排序

E.reducetask根据自己的分区号,去各个maptask机器上取相应的结果分区数据

F.reducetask会取到同一个分区的来自不同maptask的结果文件,reducetask会将这些文件再进行合并(归并排序)

G.合并成大文件后,shuffle的过程就结束了,后面进入reducetask的逻辑运算过程(从文件中取出一个一个的键值对group,调用用户自定义的reduce()方法)


shuffle中的缓冲区大小会影响到mapreduce程序的执行效率,一般来说,缓冲区越大,磁盘io的次数越少,执行速度越快

缓冲区的大小通过参数io.sort.mb来调整,默认100M







原创粉丝点击