MR的执行流程
1.MR程序分为MapTask阶段和ReduceTask阶段,且:
1个切片 = 1个Block块 = 1个MapTask任务 = 1个分好区, 排好序, 规好约的文件.
1个分区 = 1个ReduceTask任务 = 1个结果文件.
2.先对文件切片, 每个切片的大小默认和Block块大小一致(即:128MB), 且每个切片的数据会交由1个MapTask任务来处理.
3.MapTask任务采用逐行的方式从切片中读取数据, 逐行处理, 且会将处理后的数据放到 环形缓冲区(默认大小:100MB, 溢写比:0.8).
4. 当环形缓冲区达到溢写比的时候, 会触发溢写线程(spill), 对该部分数据做分区, 排序, 规约的操作, 然后存储到磁盘上(小文件).
5.对上述的小文件进行合并(默认:10个一合并), 获取最终的文件, 即: 1个MapTask = 1个分好区, 排好序, 规好约的文件.
6.当MapTask任务执行结束后, ReduceTask会开启一个拷贝线程, 从各个MapTask的结果文件中, 拷贝属于自己的数据(根据分区编号识别).
7. ReduceTask对数据进行合并, 排序的操作, 获取最终结果数据.
8.ReduceTask将处理好的结果数据写到磁盘文件中, 1个ReduceTask = 1个结果文件, 至此, MR程序执行结束.
Yarn的调度流程
1.客户端提交计算任务(例如:MR任务,Spark任务,Flink任务等)给到ResourceManager.
2.ReduceManager校验任务合法后, 活找到一台nodemanager节点, 创建AppMaster进程.
1个计算任务 = 1个AppMaster进程.
3. AppMaster进程回合ResourceManager建立心跳机制, 并通过心跳包的方式获取到要执行的计算任务的信息, 之后会计算执行该任务所需的资源.
4. AppMaster找ResourceManager申请执行该计算任务所需的资源.
5.ResourceManager接收到AppMaster的请求后, 会找一些nodemanager, 在其上创建一些Container资源容器, "占用"资源, 用于执行该计算任务.
6.AppMaster会连接到nodemanager, 从而找到这些Container资源容器.
7.AppMaster会让计算任务在Container资源容器中执行,并实时监听计算任务的状态,当MapTask任务执行结束后,AppMaster会通知ReduceTask开始执行,当ReduceTask执行结束后,整个计算任务就做完了.
8.AppMaster会将该计算任务的结果返回给ResourceManager,并通知ResourceManager可以释放该计算任务的Container资源了,并启动自毁,至此,整个流程结束。