hadoop系列(13)---Hadoop计算组件MapReduce(二)

193 阅读2分钟

这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战MapReduce编程模型中 splitting 和 shuffing 操作都是由框架实现的,需要我们自己编程实现的只有 mapping 和 reducing,这也就是MapReduce这个称呼的来源MapReduce 编程模型中 splitting 和 shuffing 操作都是由框架实现的,需要我们自己编程实现的只有 mapping 和 reducing,这也就是 MapReduce 这个称呼的来源

下面就讲些一下MapReduce的执行过程

MapReduce编程模型实现细节

MapReduce.jpg

mapReduce 执行细节.jpg

Map过程

①读取文件切片中的数据

默认是通过**TextInputFormat**中的**RecordReader中的**read()**方法去文件切片中读取数据读取的格式**是一行一行读取

②Mapper的逻辑处理

对数据进行映射整理

也就是对上面一行读取的数据进行解析处理成Hadoop可以处理分析的数据

例如:

//当**TextInputFormat**读取到的**行数据**是:北京,上海,深圳,广州,杭州
****那么在mapper中就可以对这行数据进行“,”的切割 转换为:[北京,上海,深圳,广州,杭州]
//如果对数据还有进一步的映射的话
例如对应关系:<北京,1>,<上海,2>,<深圳,3>,<广州,4>,<杭州,5>
也可以在mapper进行映射转化 转化后的对应可以得出:[1,2,3,4,5]

③写入环形缓存区

通过mapper中的上下文(context)可以通过write函数→**context.write(数据)**写入hadoop的环形缓冲区


  ⑴环形缓冲区

环形缓冲区会有依次2个扇区分别存放<元数据指针(kvindex),元数据信息(kvmeta)>

数据缓存

当数据超过环形缓冲区的**(默认80%)**的时候会进行溢写操作

由于环形缓存区溢写是从开始节点开始读取的所以在超过80%如果还有数据需要写入缓冲区就会开始反向写入

⑤当然在数据进入缓冲区之前会有依次快速排序,这样会形成分区内部为分区有序的状态

⑥、⑦、⑧ combiner

(mini版本的reduce):在需要的情况下→如果需要聚合 那么第一阶段会在快排的过程中进行第一次聚合如图中⑥所示,接下来在归并排序形成大的缓存文件进行第二次聚合如图中⑦⑧所示

接下来就会对数据进行压缩并且写入到硬盘文件当中如图中⑨⑩所示

Reduce过程

⑴在磁盘中存放着map阶段的数据(待聚合计算的数据)

⑵reduce会去fecth对应的数据到自己的内存缓冲区当中

**内存不够**的时候会**溢写到本地磁盘**当中

⑶在溢写的过程当中会进行归并排序

因为有可能来自不同的机器上,所以会导致文件内部的内容并不是有序的但是可以在map的溢写阶段已经进行过一次分区内部的排序 所以可得的到每个分区的内部是有序的,所以进行key的归并排序。

⑷⑸ 接下来reduce会抽取对应key的内容进行聚合,最后输出