深入Hadoop之MapReduce

本文详细介绍了MapReduce的工作流程,包括WordCount处理过程及Shuffle机制,并提供了MapReduce调优的方法,如MapTask输出压缩、ShufflePhase参数调整及合理设置ReduceTask数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MapReduce工作流程

这里写图片描述

WordCount 处理过程

这里写图片描述
1、将文件拆分成splits,并将文件按行分割成”key,value”对。
2、将分割好的”key,value”对交给用户定义的map方法进行处理,生成新的”key,value”对。
3、将map方法输出的”key,value”对后,Mapper会将它们按照key值进行排序。
4、Reduce先对Mapper接收的数据进行排序,在交给用户自定义的reduce方法进行处理得到新的”key,value”对,并作为WordCount的结果输出。

Shuffle过程

概念
shuffle的意思是洗牌或打乱。
Collections.shuffle(list) :随机地打乱参数list里的元素顺序。
MapReduce里的shuffle:描述着数据从map task输出到Reduce task输入的这个过程。
Shuffle过程图
这里写图片描述
1、Collect阶段:将MapTask的结果输出到默认大小为100M的MapOutputBuffer内部环形内存缓冲区,保存的是”key,value”、Partition分区。
2、Spill阶段:当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,先是对partition分区号进行排序,再对key排序,如果配置了combiner,还会将有相同分区号和key的数据进行排序,如果有压缩设置,则还会对数据进行压缩操作。
3、Combiner阶段:等MapTask任务的数据处理完成之后,会对所有map产生的数据结果进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件。
4、Copy阶段:当整个MapReduce作业的MapTask所完成的任务数据占到MapTask总数的5%时,JobTracker就会调用ReduceTask启动,此时ReduceTask就会默认的启动5个线程到已经完成MapTask的节点上复制一份属于自己的数据,这些数据默认会保存在内存的缓冲区中,当内存的缓冲区达到一定的阀值的时候,就会将数据写到磁盘之上。
5、Merge阶段:在ReduceTask远程复制数据的同时,会在后台开启两个线程对内存中和本地中的数据文件进行合并操作。
6、Sort阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask阶段已经对数据进行了局部的排序,ReduceTask只需做一次归并排序就可以保证Copy的数据的整体有效性。

MapReduce调优

Map Task 输出压缩:在数据量大的时候,对map输出进行压缩通常是个好主意。
Shuffle Phase 参数:如果能够让所有数据都保存在内存中,可以达到最佳的性能。通常情况下,内存都保留给reduce函数,但是如果reduce函数对内存需求不是很高,将mapreduce.reduce.merge.inmem.threshold(触发合并的map输出文件数)设为0,mapreduce.reduce.input.buffer.percent(用于保存map输出文件的堆内存比例)设为1.0,可以达到很好的性能提升。
Reduce Task Number:避免写入多个spill文件可能达到最好的性能,一个spill文件是最好的。通过估计map的输出大小,设置合理的mapreduce.task.io.sort.*属性,使得spill文件数量最小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值