mr执行过程及运行原理

split逻辑切分:

这里的分片不是物理分片,输入分片存储的并非数据本身,而是一个分片长度和一个记录数据的位置的数据

例如10MB文件,切分10各1MB小文件,0-1MB位置定义为第一个切片,1MB-2MB定义为第二个分片

map阶段(每个分片对应一个map task)

每个mapper任务都是一个java进程,它读取hdfs文件中自己对应的输入分片,将分片中记录按照一定规则调用map函数解析成键值对,如<word,1>,<word,1>形式,如果有100个键值对,就调用100次map方法

键:每一行的起始位置            值:本行的文本内容

map shuffle阶段、洗牌阶段,分区partition,排序sort,combine(本地reducer),合并

map方法输出的数据,进入到内存缓冲区,缓冲区满了后,启动线程写磁盘,在启动线程写磁盘之前,对数据进行key的hash分区,对每个分区进行key值排序,设置了combiner,则对排序的数据做简单的合并重复key值操作,如<word,2>,写磁盘操作会产生多个文件,当map写完磁盘后则对文件进行一次合并,确保一个map task最终只生成一个数据文件

reduce shuffle阶段:copy、merge、reduce

map方法输出完成后,reduce线程会启动copy线程,请求所有map task的输出结果,如果reduce端接收的数据量小,则直接存内存中,数据量超过内存,则数据数据合并后写磁盘,在写磁盘过程中会把这些文件合并成一个更大的有序文件,最后一次合并的结果没有写磁盘,直接输入给reduce函数中

对copy过来的数据先放入内存缓冲区中,如果是数据量超过缓冲区大小,则对数据合并后写磁盘,如果设置combiner,combiner也可以这个时候做合并,如果map task1中的<word,1>,map task2中的<word,2>,那么combiner之后则为<word,{1,2}>

调用reduce函数

reduce阶段分组好的<word,{1,2}>,调用reduce函数进行聚合<word,3>,将结果输出到hdfs,每个reduce进程会对应一个输出文件,名称以part-开头

词频统计mr过程:

split:由于输入文件太大,mapreduce会对其进行分割,大文件会被切分成多份

map:解析出每一行中的每个单词,并在后面记上数字1,表示此单词出现过1次

shuffle:将每一份中相同的单词分组到一起,并按默认字母顺序进行升序排序

reduce:将每一组中的单词出现的次数进行累加求和

以上复杂的运行过程,用一张图来简单说明,方便理解和记忆,如下图所示:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容