从上图(此图是Apache官网图片)可以看到以下几个节点:
-
Container:是计算资源的抽象代表着一组内存/cpu/网路的占用。
-
ResourceManager:统筹计算资源,管理所有NodeManager,进行资源分配。
-
NodeManager:管理物理主机上的计算资源,负责向RM汇报自身状态信息
-
MRAppMaster:计算任务的Master,负责申请计算资源,协调计算任务。
-
YarnChild:负责做实际计算的任务/进程(MapTask/ReduceTask)
-
MapTask:Map阶段的任务
-
ReduceTask:Reduce阶段的任务
任务流程如下:
- 用户向 YARN 中提交应用程序,其中包括 Application 程序、启动 Application 的命令、用户程序等。
- ResourceManager 为该应用程序分配第一个 Container,并与对应的 NodeManager 通信,要求它在这个 Container 中启动应用程序的 MRAppMaster。
- MRAppMaster 首先向 ResourceManager 注册,这样用户可以直接通过 ResourceManage 查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运 行状态,直到运行结束,即重复步骤 4~7。
- MRAppMaster 采用轮询的方式通过 RPC 协议向 ResourceManager 申请和 领取资源。
- 一旦 MRAppMaster 申请到资源后,便与对应的 NodeManager 通信,要求 它启动任务。
- NodeManager 为任务设置好运行环境(包括环境变量、JAR 包、二进制程序 等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
- 各个任务通过某个 RPC 协议向 MRAppMaster 汇报自己的状态和进度,以让 MRAppMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。 在应用程序运行过程中,用户可随时通过 RPC 向 MRAppMaster 查询应用程序的当 前运行状态。
- 应用程序运行完成后, MRAppMaster 向 ResourceManager 注销并关闭自己。
MapReduce 流程如下:
- 输入文件分片,每一片都由一个MapTask来处理
- Map输出的中间结果会先放在内存的map环形缓冲区中,这个缓冲区的大小默认是100M,当缓冲区中的内容达到80%时(80M)会将缓冲区的内容写到磁盘上。也就是说,一个map会输出一个或者多个这样的文件。
- 从缓冲区写到磁盘的时候,会进行分区并排序,如果定义了Combiner的话,也会进行combiner操作。combiner操作就是在这个把缓冲区数据写到磁盘对溢写文件合并的时候运行的,执行的是Reduce逻辑,这样就能够减少计算量。
- 如果一个map产生的中间结果存放到多个文件,那么这些文件最终会合并成一个文件,这个合并过程不会改变分区数量,只会减少文件数量。
- 以上只是一个mapTask的输出,接下来进入reduceTask阶段。
- 每个reducer对应一个ReduceTask,在真正开始reduce之前,先要从分区中抓取数据,这个过程需要经过网络的传输,这个地方可以使用压缩来进行优化。
- 相同的分区的数据会进入同一个reduce。这一步中会从所有map输出中抓取某一分区的数据,在抓取的过程中伴随着排序、合并。
- reduce输出
注:分区是在mapTask阶段对数据进行一个操作,这个分区不论是在map阶段文件合并还是发送到reduce阶段,如果数据分到了A分区,就会一直在A分区,不会因为操作的进行而改变。