一、shuffle机制
1、概述
(1)MapReduce 中, map 阶段处理的数据如何传递给 reduce 阶段,是 MapReduce 框架中最关键的一个流程,这个流程就叫 Shuffle;
(2)Shuffle: 数据混洗 ——(核心机制:数据分区,排序,缓存);
(3) 具体来说:就是将 maptask 输出的处理结果数据,分发给 reducetask,并在分发的过程 中,对数据按 key 进行了分区和排序;
2、主要流程
3、详细流程
(1)maptask 收集我们的 map()方法输出的 kv 对,放到内存缓冲区中
(2)从内存缓冲区不断溢出本地磁盘文件,可能会溢出多个文件 (至少一个)
(3)多个溢出文件会被合并成大的溢出文件 (慢慢排序,不是都结束之后才排序)
(4)在溢出过程中,及合并的过程中,都要调用 partitoner 进行分组和针对 key 进行排序
(5)reducetask 根据自己的分区号,去各个 maptask 机器上取相应的结果分区数据
(6)reducetask 会取到同一个分区的来自不同 maptask 的结果文件, reducetask 会将这些文件 再进行合并(归并排序)
(7)合并成大文件后, shuffle 的过程也就结束了,后面进入 reducetask 的逻辑运算过程(从 文件中取出一个一个的键值对 group,调用用户自定义的 reduce()方法)
Shuffle 中的缓冲区大小会影响到 mapreduce 程序的执行效率,原则上说,缓冲区越大,磁 盘 io 的次数越少,执行速度就越快
缓冲区的大小可以通过参数调整, 参数: io.sort.mb 默认 100M (溢出条件0.8(80%))
4、流程图
二、Yarn
1、yarn 概述
YARN( Yet Another Resource Negotiator)
Yarn 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作 系统平台,而 MapReduce 等运算程序则相当于运行于操作系统之上的应用程序
(1)yarn 并不清楚用户提交的程序的运行机制
(2)yarn 只提供运算资源的调度(用户程序向 yarn 申请资源, yarn 就负责分配资源)
(3)yarn 中的主管角色叫 ResourceManager
(4)yarn 中具体提供运算资源的角色叫 NodeManager
(5)这样一来, yarn 其实就与运行的用户程序完全解耦,就意味着 yarn 上可以运行各种类型 的分布式运算程序( mapreduce 只是其中的一种),比如 mapreduce、 storm 程序, spark 程序, tez ……
(6)所以, spark、 storm 等运算框架都可以整合在 yarn 上运行,只要他们各自的框架中有符 合 yarn 规范的资源请求机制即可
(7)yarn 就成为一个通用的资源调度平台,从此,企业中以前存在的各种运算集群都可以整 合在一个物理集群上,提高资源利用率,方便数据共享
2、yarn的重要概念
(1)ResourceManager
ResourceManager 是基于应用程序对集群资源的需求进行调度的 Yarn 集群主控节点,负责协 调和管理整个集群( 所有 NodeManager) 的资源,响应用户提交的不同类型应用程序的解 析,调度,监控等工作。ResourceManager 会为每一个 Application 启动一个 ApplicationMaster,
并且 ApplicationMaster 分散在各个 NodeManager 节点
它主要由两个组件构成:调度器( Scheduler)和应用程序管理器( ApplicationsManager, ASM)
(2)NodoManager
NodeManager 是 YARN 集群当中真正资源的提供者,是真正执行应用程序的容器的提供者, 监控应用程序的资源使用情况( CPU,内存,硬盘,网络), 并通过心跳向集群资源调度器 ResourceManager 进行汇报。
(3)ApplicationMaster (申请容器、监控任务)
ApplicationMaster 对应一个应用程序,职责是: 向资源调度器申请执行任务的资源容器,运 行任务,监控整个任务的执行,跟踪整个任务的状态,处理任务失败以异常情况
(4)Container
Container 是一个抽象出来的逻辑资源单位。 它封装了一个节点上的 CPU,内存,磁盘,网络等信息, MapReduce 程序的所有 task 都是在一个容器里执行完成的,容器的大小是可以 动态调整的
(5)ASM
应用程序管理器 ASM 负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协 商资源以启动 ApplicationMaster、监控 ApplicationMaster 运行状态并在失败时重新启动它等
(6)Scheduler
调度器根据应用程序的资源需求进行资源分配,不参与应用程序具体的执行和监控等工作 资源分配的单位就是 Container,调度器是一个可插拔的组件, 用户可以根据自己的需求实 现自己的调度器。 YARN 本身为我们提供了多种直接可用的调度器,比如 FIFO, Fair Scheduler
和 Capacity Scheduler 等
3、yarn的架构
4、 yarn作业执行流程
YARN 作业执行流程:
(1)用户向 YARN 中提交应用程序,其中包括 ApplicationMaster 程序,启动 ApplicationMaster 的命令,用户程序等。
(2) ResourceManager 为该程序分配第一个 Container,并与对应的 NodeManager 通讯,要求 它在这个 Container 中启动应用程序 ApplicationMaster。
(3)ApplicationMaster 首先向 ResourceManager 注册,这样用户可以直接通过 ResourceManager 查看应用程序的运行状态,然后将为各个任务申请资源,并监控它的运行状态,直到运行结 束,重复 4 到 7 的步骤。
(4) ApplicationMaster 采用轮询的方式通过 RPC 协议向 ResourceManager 申请和领取资源。
(5)一旦 ApplicationMaster 申请到资源后,便与对应的 NodeManager 通讯,要求它启动任务。
(6)NodeManager 为任务设置好运行环境(包括环境变量、 JAR 包、二进制程序等)后,将 任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
(7)各个任务通过某个 RPC 协议向 ApplicationMaster 汇报自己的状态和进度,以让 ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务败的时候重新启动任务。
(8)应用程序运行完成后, AM 向 RM 注销并关闭自己。