Hadoop-YARN
一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台。
架构
ResourceManager(RM)
独立的守护进程。
由 Scheduler 和 ApplicationsMaster(ASM) 组成。
处理 Client 请求。
监控 NodeManger。
启动/监控 AppliacationMaster。
资源的分配与调度。
NodeManager(NM)
- 每个节点对于一个 NodeManager,管理单个节点的资源。
- 处理来自 ResourceManager 的命令。
- 处理来自 ApplicationMaster 的命令。
- 监控节点状态、资源使用情况和 Container 运行情况,并定期回报给 ResourceManager。
- 类似 TaskTracker。
ApplicationMaster(AM)
每一个提交的 Job 都由一个与之对应的 ApplicationMaster 来管理。
负责数据的切片。
为应用程序申请资源并分配给内部任务。
任务的监控与容错。
Container
- 是资源的抽象。
- 封装了某个节点上的多维度资源,例如内存、CPU、磁盘、网络等。
流程
- Client 向 RM 提交 Job,RM 会返回一个 ApplicationID 作为回应。
- RM 根据从 Client 的 NM 收集的资源信息,调度一个合适的 NM,来启动一个 Container(常被称为 container0)以运行 AM 实例。
- AM 创建成功后向 RM 中的 ASM 注册自己。
- AM 注册成功后,会对数据进行切分,然后向 RM 申请资源,以 Container 的形式,RM 会根据调度策略提供资源。
- AM 申请到资源成功后,会与 NM 通信,请求启动任务。
- 启动后的每个 Task 会定时向 AM 提供自己的状态信息和执行的进度。
- 运行完成后 AM 会向 ASM 注销和关闭自己,AM 会释放相应的 Container。
资源调度器
FIFO Schedule (先进先出调度器)
Capacity Scheduler(容量调度器)
支持多队列,每个队列可配置一定的资源量,每个队列采用FIFO调度策略。
为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定。
- 计算每个队列中正在运行的任务数与其应该分得的计算资源之间的比值,选择一个该比值最小的队列——最闲的。
- 按照作业优先级和提交时间顺序,同时考虑用户资源量限制和内存限制对队列内任务排序。
Fair Scheduler(公平调度器)
支持多队列多用户,每个队列中的资源量可以配置,同一队列中的作业公平共享队列中所有资源。
在资源有限的情况下,每个 Job 理想情况下获得的计算资源与实际获得的计算资源存在一种差距,这个差距就叫做缺额。在同一个队列中,Job 的资源缺额越大,越先获得资源优先执行,作业是按照缺额的高低来先后执行的。
任务的推测执行
- 作业完成时间取决于最慢的任务完成时间。
执行机制
- 发现较慢的任务,比如运行速度远慢于任务平均速度。为其启动一个备份任务,同时运行。采用先运行完的结果。
前提条件
- 每个 Task 只能有一个备份任务。
- 当前 Job 已完成的 Task 比例必须不小于 0.05
参数设置
mapreduce.map.speculative
= true
例外情况
- Task 间存在严重的负载倾斜
- 特殊 Task,比如向数据库中写数据。
算法原理
假设某一时刻,Task 执行进度为 progress
,则可通过一定的算法推测出该任务的最终完成时刻 estimateEndTime
。另一方面,如果此刻为该 Task 启动一个备份 Task,则可推断出它可能的完成时刻 `estimateEndTime’。
总是选择为 estimateEndTime-estimateEndTime'
差值最大的 Task 启动备份 Task。
为了防止大量 Task 同时启动备份 Task 造成的资源浪费,每个作业设置了同时启动的备份任务数目上限。
推测执行机制实际上采用了经典的优化算法:空间换时间,它同时启动多个相同任务处理相同的数据,并让这些任务竞争以缩短数据处理时间,这种方法需要占用更多的计算资源。在集群资源紧缺的情况下,应合理使用该机制,争取在多用少量资源的情况下,减少作业的计算时间。