mapreduce中map阶段的主要流程是:1.首先进行一系列的逻辑操作;2. 通过outputCollector向环形缓冲区写入数据;3. 进行反向溢写。其中,map方法直接写给reduce的话相当于直接操作磁盘,太多的IO操作使得效率太低,则在map和reduce中间还有一个shuffle操作。
一、mapreduce中map阶段的主要流程
1.首先进行一系列的逻辑操作
map方法首先进行一系列的逻辑操作,执行完成后最后进行写操作。map方法如果直接写给reduce的话,相当于直接操作磁盘,太多的IO操作,使得效率太低,所以在map和reduce中间还有一个shuffle操作。
2. 通过outputCollector向环形缓冲区写入数据
map处理完成相关的逻辑操作之后,首先通过outputCollector向环形缓冲区写入数据,环形缓冲区主要两部分,一部分写入文件的元数据信息,另一部分写入文件的真实内容。
3. 进行反向溢写
环形缓冲区的默认大小是100M,当缓冲的容量达到默认大小的80%时,进行反向溢写。在溢写之前会将缓冲区的数据按照指定的分区规则进行分区和排序,之所以反向溢写是因为这样就可以边接收数据边往磁盘溢写数据。在分区和排序之后,溢写到磁盘,可能发生多次溢写,溢写到多个文件,对所有溢写到磁盘的文件进行归并排序,在9到10步之间还可以有一个Combine合并操作,意义是对每个MapTask的输出进行局部汇总,以减少网络传输量。
延伸阅读:
二、MapTask各阶段
整个MapTask分为Read阶段,Map阶段,Collect阶段,溢写(spill)阶段和combine阶段。
Read阶段
MapTask通过用户编写的RecordReader,从输入InputSplit中解析出一个个key/value
Map阶段
该节点主要是将解析出的key/value交给用户编写map()函数处理,并产生一系列新的key/value
Collect收集阶段
在用户编写map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结果。在该函数内部,它会将生成的key/value分区(调用Partitioner),并写入一个环形内存缓冲区中
Spill阶段
即“溢写”,当环形缓冲区满后,MapReduce会将数据写到本地磁盘上,生成一个临时文件。需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作。
以上就是关于mapreduce中map阶段的内容希望对大家有帮助。