map-reduce的五次io

本文详细解析了MapReduce的执行流程,包括从输入文件的读取、Map任务处理、溢出与排序、Reduce任务的数据获取以及最终的reduce处理和结果输出。整个过程涉及五次IO操作,分别是:map任务的输入读取、环形缓冲区溢出写入本地、溢出文件合并、reduce任务获取数据及reduce输出。文章深入介绍了每个阶段的数据处理和排序细节,对于理解MapReduce的工作机制极具帮助。
摘要由CSDN通过智能技术生成

########################## mapreduce 原理 (五次IO) ###############################
第一次IO:
map task读入文件:调用Inputformat读入文件进行split逻辑切片——>recordreader——>read()每次读入一行。返回值是(k,v)形式,key为行号偏移量,value为行的内容。
一个split对应一个map,切片数量的计算公式:splitSize = Math.max(minSize, Math.min(maxSize, blockSize))。
调用map()方法将(k,v)转化为新的(k,v)键值对,由context.write输出到outputcollector(削峰作用)中。
第二次IO:
在outputcollector中将(k,v)键值写入环形缓冲区中,缓冲区默认大小为100M,当写到80%时溢出,写到本地磁盘文件中。如果map阶段处理的数据量较大会溢出多个文件。
在环形缓冲区中会进行排序(快速排序)和分区(调用hashpartitioner)。对每个键值对hash一个partition值,相同的partition为一个区,同一区中按key排序。
第三次IO:
多个溢出文件会merge合并成一个大文件,合并采用归并排序,合并后的map task的最终文件还是分区且区内有序。
第四次IO:
reduce task根据分区号,去各个map task上copy相同分区的数据到reduce task本地磁盘工作目录。
同一分区不同map task中的文件再merge合并成一个大文件,同样是归并排序,文件内容按照key值有序。
第五次IO:
读取文件,对数据按key进行分组,每取出一组键值对就调用自定义的reduce()方法进行逻辑处理
最后通过outputformat方法将结果写入结果文件中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值