MapReduce的执行流程及优化
执行流程:
- 程序在调用
submit()
方法之前,会生成一份任务分配规划。 - 提交数据到
RecourseManager(RM)
,包含一份job.split
文件和job.xml
文件和jar包
。 RM
根据提交的资源文件,分配任务,根据切片的个数启动相应的mapTask
任务个数。mapTask
任务根据程序设置的文件读取类去读文件数据,比如TextFileInputFormat
,底层是调用RecorderReader
组件的reader()
方法去读取数据。- 数据读取进入
map
方法,执行我们的业务逻辑,最后写出。 - 数据写出时,先经过分区方法,标记好数据所属的分区,再进入环形缓冲区。 默认按照
key
的hashCode % reduceTask 数量 = 分区号
,当然也可以自定义分区。 - 当环形缓冲区的数据量大小达到阈值(默认80%)时,数据溢写到磁盘文件。
- 在溢写之前,会根据按照字典顺序对
key
进行快速排序。 - 当分区溢写到磁盘的文件数量达到默认的10个时,会进行
merge
操作,把10个文件合并为1个。在合并的过程中会做归并排序。 - 如果配置了
combiner
,则在归并之前执行combiner
合并。 - 当所有的
mapTask
任务执行完成,则根据分区个数启动对应数量的