Yarn及MapReduce工作流程(总结版)
(未写出在hdfs上传和下载数据的流程,此流程请详见nn和2nn的爱恨情仇以及nn和dn的老大和小弟的故事)
Yarn工作流程:
1.MR程序提交到客户端所在的节点,客户端向RM发出申请Application的请求
2.RM同意,并返回提交资源的路径stag和application_id。
3客户端向集群的hdfs提交job运行所需要的资源,提交之后会生成向集群提交数据的stag路径、生成job_id、FileInputFormat调用getSplites()获取切片规划,并序列化成二进制文件、含有job运行参数的job.xml、集群运行所需要的jar包。
4.资源提交完毕之后,向RM提交执行MRAppMaster的请求。
5.RM把客户端的请求变成Task,并放进容量资源调度器(hadoop默认的),等待节点认领。
6.某个节点拿到Task之后,生成Contain容器,并运行MRAppmaster。
7.下载hdfs上的资源到本地。
8.根据在hdfs上下载的切片规划,MR向RM申请运行运行的切片等同数量的MapTask。
9.RM把Task放容量资源调度器,等待指定的节点领取MapTask。
10.节点领取到MapTask之后,生成contain,并执行MapTask;
MapTask阶段:
11.MapTask会调用默认的TextInputFormat使用LineRecordReader一行行读取文件的数据。(read阶段)
12.读取的数据经过map()之后,会被上下文对象context以kv键值对的形式写出会,并等待被Collector环形缓冲区(默认是100m)使用collect()收集。(map阶段)
13.数据到了环形缓冲区之后,会选择一个分界点,kv数据会向右边存储,kv的元信息(包括索引、分区信息、keystart、valuestart)向左边存储,当达到环形缓冲区的百分之八十之后(默认是半分之八十),在剩下的20m中寻找一个新的分界点,存储的形式跟原来保持一致;存储完毕的80m会溢出落盘,在溢出之前会进行一次快速排序,保证数据在区内有序,如果有conbiner(),那么会进行区内的key合并,做完这些之后才进行落盘。如果写入环形缓冲区的速度大于溢出的速度,写入会等待一下。(collect阶段、spill(溢出)阶段)
14.溢出完毕之后,会把本节点所有的溢出文件进行一次归并排序形成一个大的文件,如果有conbiner(),会进行一次节点内合并key。(meger(合并)阶段)
RedcueTask阶段:
15.ReduceTask会主动copy自己负责的区的所有节点的数据,如果数据不大ÿ