浅谈MapReduce

MapReduce的原理

MapReduce是一个分布式计算模型,解决海量数据的计算问题

将整个并行计算过程抽象成两个函数map()和reduce()用户只需要实现map()和reduce()函数即可实现分布式计算

MapReduce的核心思想是分治

map负责分,将一个大的任务分成若干个简单的小任务并行处理,前提是这些小文件可以并行计算,并且之间几乎没有依赖关系

reduce负责合,将map处理的数据进行汇总

MapReduce的八个执行步骤

第一步:读取文件解析成key,value对

第二步:自定义map逻辑将第一步的k1v1转换成k2v2

第三步:分区将相同key的value分到一个reduce中形成一个集合默认使用hash分区

第四步:排序对我们的数据进行字典顺序的排列

第五步:规约将我们的数据在map端进行一次聚合,减少输出的数据量

第六步:分组将相同的数据分到同一组里面去调用一次reduce逻辑

第七步:自定义reduce逻辑接收k2v2转换成k3v3输出

第八步:输出将我们reduce处理完成的数据进行输出

MapReduce框架结构

MRAppMaster:负责整个程序的过程调度以及状态协调

MapTask:负责map阶段的数据处理流程

ReduceTask:负责reduce阶段的数据处理流程

MapReduce总运行流程

一个mr程序启动的时候,首先会启动MRAppmaster,mrappmaster会根据本次的job的详情信息,计算出所需要的maptask的个数,并向集群中申请启动相应数量的maptask进程

maptask进程启动后会根据设置的数据分片的大小进行数据处理

mrappmaster监控到所有的maptask任务结束后,会根据用户给定的参数启动相应的reducetask进程,并告知reducetask进程要处理的数据范围

reducetask进程启动后会根据mrappmaster告知的待处理数据所在位置,去启动了maptask进程的机器上获取maptask输出结果文件,并在本地进行重新归并排序,然后按照相同key为一个组,根据用户设置的reduce()方法进行逻辑运算并调用指定的outputformat将结果数据输出到外部存储

combiner与partition的作用

combiner的作用是map端的reduce聚合

partition的作用是分区,知道key到哪个reduce

其中MapReduce中map输出的数据会根据不同的key输入到不同的reduce,就是通过partition,在缺省的情况下默认是HashPartitioner,他通过对key区hash值,然后对reduce的数据取模,就可以判断该key以及对应的valuelist应该去哪个reduce上进行处理

MapTask运行机制以及Map任务的并行度

input file会通过split进行逻辑切分成一个个split文件,通过record按行读取内容给用户自定义的map逻辑进行处理,处理过的数据交给outputcollector收集器,然后进行分区(默认使用hash分区),然后写入buffer,每个maptask都有一个内存缓冲区(环形缓冲区)存储map的输出结果,当内存缓冲区快满的时候会将缓冲区的数据以临时文件的方式存放到磁盘(这个过程被称为spill,也就是溢写),当整个maptask结束后再对磁盘中这个maptask产生的所有临时文件做合并,生成最终的正式输出文件,然后等待reducetask来拉数据

缓冲区的作用是批量收集map结果,减少磁盘IO的影响,它其实是一个数组,有大小限制默认是100MB

ReduceTask工作机制以及并行度

reduce进程开启多个数据copy线程通过http方式请求maptask获取属于自己的文件,然后会启动两个merge线程对内存到本地的数据文件进行合并操作,在合并的同会进行排序操作最后调用用户自定义的reduce函数进行处理.

MapReduceshuffle过程

collect阶段,将maptask的结果输入到环形缓冲区中,保存的是key/value.partition分区信息等.

spill阶段:当内存中的数据达到阈值的时候会将数据写入本地磁盘

merge阶段:吧所有溢出的临时文件进行一次合并操作,保证一个maptask最终只产生一个中间数据文件

copy阶段:reducetask启动Fetcher线程到maptask中获取属于自己的数据,这些数据会默认保存在内存缓存区中,当内存缓冲区的数据达到一定的阈值,就会将数据写入到磁盘上

merge阶段,在reducetask复制数据的同时,会在后台启动两个线程对内存到本地的数据文件进行合并操作

sort阶段,在对数据合并的同时会进行排序操作

shuffle中的缓冲区大小会影响到MapReduce程序的执行效率,原则上说,缓冲区越大,磁盘IO的次数越少,执行效率就越快

缓冲区大小可根据参数:MapReduce.task.io.sort.mb设置,默认为100M

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值