这是我参与「第四届青训营 」笔记创作活动的的第十天
一、本篇笔记重点内容:
- MapReduce编程规范
- MapTask工作机制
- ReduceTask工作机制
二、详细知识点介绍:
MapReduce编程规范
Mapper
- Mapper继承父类
- 输入数据是KV对
- 业务逻辑写在map方法中
- 输出数据是KV对
- map()方法(MapTask进程)对每一个<K,V>调用一次
Reducer
- Reducer继承父类
- 输入数据是KV
- 业务逻辑写在reduce方法中)
- ReduceTask进程对每一组相同k的<k,v>组调用一次reduce()方法
Driver
- 用于提交整个程序到YARN集群,提交的是
- 封装了MapReduce程序相关运行参数的job对象
MapTask工作机制
五个阶段 job 的提交流程
-
客户端对任务切片划分,提交给yarn,提交内容有:切片、jar包、job.xml,yarn开启MrAppMaster计算出MapTask数量
-
Read
由InputFormat(默认TextInputformat)中的RecorderReader读取数据(k,v)
- Map
进入到map()方法中,输出(k,v)
- Collect、溢写阶段、Merge阶段 向环形缓冲区中写入(k,v), 一侧索引,一侧数据(默认大小100M),到达80%后反向溢写。 溢写的时候会进行分区,并默认按照key的hashcode值,对reduceTask进行取余。根据余数相同的分到一个分区中。 在分区时还会进行排序,默认按字典顺序。使用快排(利用元数据Keystart、valstart进行排序)。 Key -> key的hashcode ->根据reduceTask的个数取余->根据取余的结果进行分区。 在MapTask结束的时候,会将相同分区的数据(来自多个溢写文件)聚合到一块(保证每一个分区内部有序)。并进行排序,使用归并排序。MapTask自此结束。
ReduceTask工作机制
三个阶段 MapTask数据准备好,已经持久化在磁盘上,等待Reduce拉取
- Copy (来自多个MapTask任务)拉取指定分区的数据
- Sort (来自多个MapTask任务)相同分区的拉取到一块,进行合并和排序,归并排序。一个ReduceTask去处理一个分区的数据。
- Reduce ReduceTask会根据相同的key分组,key相同的数据被分为了一组。一组数据去调用一次reduce方法。一个reduceTask处理完以后使用OutputFormat写入到一个reduceTask文件中。
按照 MapReduce 语义,用户编写 reduce()函数输入数据是按 key 进行聚集的一组数据。为了将 key 相同的数据聚在一起,Hadoop 采用了基于排序的策略。各个 MapTask 已经实现对自己的处理结果进行了局部排序,因此,ReduceTask 只需对所有数据进行一次归并排序即可。
三、引用参考&推荐书目:
- www.bilibili.com/video/BV1Qp… 尚硅谷大数据Hadoop教程