1、一个大文件需要处理,它在在 HDFS 上是以 block 块形式存放,每个 block 默认为 128M
存 3 份,运行时每个 map 任务会处理一个 split,如果 block 大和 split 相同(默认情况下确
实相同) , 有多少个 block 就有多少个 map 任务, 所以对整个文件处理时会有很多 map 任务
进行并行计算
2、 每个 map 任务处理完输入的 split 后会把结果写入到内存的一个环形缓冲区, 写入过程中
会进行简单排序,它的默认大小为 100M,当缓冲区的大小使用超过一定的阀值,一个后台的
线 程 就 会 启 动 把 缓 冲 区 中 的 数 据 溢 写 (spill) 到 本 地 磁 盘 中
(mapred-site.xml:mapreduce.cluster.local.dir),同 Mapper 继续时向环形缓冲区中写入数据;
3、数据溢写入到磁盘之前,首先会根据 reducer 的数量划分成同数量的分区(partition),每
个分区中的都数据会有后台线程根据 map 任务的输出结果 key2 进行内排序(字典顺序、 自然
数顺序或自定义顺序 comparator),如果有 combiner,它会在溢写到磁盘之前排好序的输出
上运行(combiner 的作用是使 map 输出更紧凑,写到本地磁盘和传给 reducer 的数据更少),
最后在本地生成分好区且排好序的小文件; 如果 map 向环形缓冲区写入数据的速度大于向
本地写入数据的速度, 环形缓冲区被写满, 向环形缓冲区写入数据的线程会阻塞直至缓冲区
中的内容全部溢写到磁盘后再次启动,到阀值后会向本地磁盘新建一个溢写文件;
4、map 任务完成之前,会把本地磁盘溢写的所有文件不停地合并成得到一个结果文件,合
并得到的结果文件会根据小溢写文件的分区而分区,每个分区的数据会再次根据 key2 进行
排序,得到的结果文件是分好区且排好序的,可以合并成一个文件的溢写文件数量默认为
10(mapred-site.xml:mapreduce.task.io.sort.factor);这个结果文件的分区存在一个映射关系,
Stay hungry Stay foolish -- http://blog.csdn.net/zhongqi2513
比如 0~1024 字节内容为 0 号分区内容,1025~4096 字节内容为 1 号分区内容等等;
5、reduce 任务启动,Reducer 个数由 mapred-site.xml 的 mapreduce.job.reduces 配置决定,
或者初始化 job 时调用 Job.setNumReduceTasks(int);Reducer 中的一个线程定期向
MRAppMaster询问Mapper输出结果文件位置, mapper结束后会向MRAppMaster汇报信息;
从而 Reducer 得知 Mapper 状态,得到 map 结果文件目录;
6、当有一个 Mapper 结束时,reduce 任务进入复制阶段,reduce 任务通过 http 协议(hadoop
内置了 netty 容器)把所有 Mapper 结果文件的对应的分区数据复制过来,比如,编号为 0 的
reducer 复制 map 结果文件中 0 号分区数据,1 号 reduce 复制 map 结果文件中 1 号分区的
数 据 等 等 , Reducer 可 以 并 行 复 制 Mapper 的 结 果 , 默 认 线 程 数 为
5(mapred-site.xml:mapreduce.reduce.shuffle.parallelcopies);
所有 Reducer 复制完成 map 结果文件后,由于 Reducer 会失败,NodeManager 并没有在第
一个 map 结果文件复制完成后删除它,直到作业完成后 MRAppMaster 通知 NodeManager
进行删除;
另外: 如果 map 结果文件相当小, 则会被直接复制到 reduce NodeManager 的内存中(缓冲区
大小由 mapred-site.xml:mapreduce.reduce.shuffle.input.buffer.percent 指定,默认 0.7);一旦
缓冲区达到reduce的阈值大小0.66(mapred-site.xml:mapreduce.reduce.shuffle.merge.percent)
或 写 入 到 reduce NodeManager 内 存 中 文 件 个 数 达 到 map 输 出 阈 值
1000(mapred-site.xml:mapreduce.reduce.merge.inmem.threshold),reduce 就会把 map 结果文
件合并溢写到本地;
7、复制阶段完成后,Reducer 进入 Merge 阶段,循环地合并 map 结果文件,维持其顺序排
序,合并因子默认为 10(mapred-site.xml:mapreduce.task.io.sort.factor),经过不断地 Merge 后
得到一个“最终文件” ,可能存储在磁盘也可能存在内存中;
8、 “最终文件”输入到 reduce 进行计算,计算结果输入到 HDFS。
MapReduce 超详细执行流程解读
最新推荐文章于 2024-06-29 17:01:13 发布