MapReduce-Map阶段和Reduce阶段

MapReduce采用“分而治之”的策略,Map阶段将数据切片并由MapTask处理,解析成键值对,经过Mapper处理和分区,数据写入环形缓冲区并排序,可能使用Combiner减少数据量。Reduce阶段则复制Map的输出,排序所有数据,Reducer处理每个分区的信息。
摘要由CSDN通过智能技术生成

MapReduce-Map阶段和Reduce阶段细节

基本思想是**“分而治之”**

Map阶段(黄色部分是细节,后续有延伸解释)

  1. 将目录下的文件进行逻辑切片,每一个切片由一个Maptask来处理。
  2. 对切片中的数据按照规则1解析成<key,value>对。
  3. 调用Mapper类中的map方法对上一步的<key,value>进行相关的处理,形成新的<key,value>键值对。
  4. 按照规则2对上一阶段输出的键值对,进行分区,分区的数量就是reduce任务运行时的并行数,默认只有一个分区(分区方式为哈希)
  5. 将上步骤产生的数据写入到一个环形缓冲区,当环形缓冲区写满之后(或者达到一定的阈值80%)会进行一个快速排序,使得该环形缓冲区写到磁盘中生成的溢写文件内的<key,value>有序。
  6. 所有的(指一个maptask生成的)溢写文件生成后,进行合并,最终生成一个大的数据文件(一个maptask对应着一个大的数据文件),这个过程需要进行一个归并排序,使得大数据文件内的数据有序。
    注意:在第5步中,可以进行一个combiner操作,也就是在快排后,写到磁盘生成溢写文件之前进行一个聚合,可以减少文件的大小。在第6步中,可能也存在一个combiner,对数据进行进一步规约,为啥说可能嘞,因为这部分源码我没读,看了几篇博客他们说有。

Reduce阶段

  1. Copy:map结束后,我们得到了由多个maptask产生的多个数据文件,每一个reducetask读取多个maptask的输出文件,并对其进行合并。
  2. 排序:将所有的文件的所有数据进行一个排序,这个是归并排序。
  3. 调用Reducer类中的==reduce()==方法处理自己所负责的分区的数据。

细节

逻辑切片:首先解释"逻辑",意思是该切片过程并没有改变磁盘中数据的实际物理位置,即不存在由切片导致的磁盘io,这个切片这是对某个文件进行逻辑上的划分。再解释"切片",默认的划分是以一个文件为切割处理单位,以数据块(128M)为单位,对这个文件进行划分为若干个切片,每个片由一个maptask处理,每个maptask生成一个最终的大文件。可是这样的话,一个8b的小文件也会被当成一个切割处理单位,划分为1(128M)的切片,单独用一个maptask处理,如果有多个这样的8b的小文件,为每个小文件分配一个maptask资源去处理是很脑瘫的做法。所以就有了合并切片的方式(CombineinputFormat),具体内容查看FileInputFormat各个实现类源码。
规则1:以wordcount为例子,按行读取每个切片的数据,按空格对其划分<key,value>。
规则2:这个分区的方式可以自己写,默认的是用key的hash,即相同的key分到一个分区,一般根据这个分区的情况设置reducetask的数量。目标肯定是使得资源可以合理的利用,每个运行节点的负载均衡(数据不倾斜)的情况下,高效的完成任务。这里是我个人认为的"分而治之"最有灵活性的地方。
Mapper:编写mapreduce的java代码需要实现三个类Driver、Mapper、Reducer,overwritter里面的相关方法
快速排序:源码是先按照key排序,key相同按照value排序
大数据文件:第6步中的一个大数据文件是指一个maptask生成一个,不是一个mapreduce任务生成一个,mapreduce任务可能在第一步会有多个逻辑切片,那自然由多个maptask,多个大数据文件。
读取:reduce中的读取,是有一个fetcher线程copy数据,此过程又会开启俩线程,一个是inMemoryMerge和onDiskMerge,分别将内存中的数据merge到磁盘中,和将磁盘中的数据进行merge。
reducetask:这个可以手动设置的

// 默认值是 1,手动设置为 4
job.setNumReduceTasks(4);

在这方面,尚硅谷说的很明白:
在这里插入图片描述
还有一个部分我没说明,就是第四部分的分区和溢写文件是相互独立的,彼此之间是无关的,

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值