Ubuntu环境下Hadoop的资源管理策略以YARN(Yet Another Resource Negotiator)为核心框架,通过资源抽象、分层调度及多维度策略实现集群资源的高效分配与利用。YARN将资源管理分为全局资源管理(ResourceManager)与节点资源管理(NodeManager),并通过ApplicationMaster协调具体任务的资源申请与执行,形成“双层调度+应用级管理”的资源管控体系。
1. 核心组件与资源抽象
YARN的资源管理基于Container(容器)这一核心抽象,每个Container封装了任务运行所需的CPU核心数、内存大小、磁盘IO、网络带宽等资源,是Hadoop集群中最小的资源分配单位。ResourceManager(RM)作为全局资源管理者,负责接收应用资源请求、协调资源分配,并通过调度器(Scheduler)实现资源的高效分发;NodeManager(NM)作为节点代理,负责启动/监控Container、上报节点资源使用情况,确保资源使用不超过Container声明的限制。
2. 主要调度器及策略
YARN提供可插拔调度器接口,支持根据集群场景选择不同调度策略,常见调度器及策略如下:
- FIFO Scheduler(先进先出):最简单的调度策略,按作业提交顺序依次分配资源。适用于单租户或小规模集群,优点是实现简单,缺点是无法处理多租户场景下的资源竞争(长任务可能饥饿)。
- Capacity Scheduler(容量调度器):基于队列的资源分配策略,管理员可为不同部门/用户设置资源容量配额(如队列A占集群30%资源),并支持资源借用(队列资源闲置时可临时共享给其他队列,有新作业提交时归还)。适用于多租户生产环境,优点是保证队列资源底线,缺点是资源利用率可能低于公平调度器。
- Fair Scheduler(公平调度器):以公平共享为核心,目标是让所有作业在时间尺度上获得相近的资源份额(如两个作业同时运行时各占50%资源,三个作业时各占1/3)。支持队列内多策略(FIFO、Fair、DRF,默认为Fair),并通过资源缺额比(资源需求量/实际使用量)优先调度缺额大的作业。适用于测试/开发或多用户共享集群,优点是资源利用率高,缺点是配置复杂。
3. 队列管理与资源隔离
YARN通过**队列(Queue)**实现资源的精细化管控:
- 队列划分:根据业务类型(如批处理、实时分析)、用户部门(如市场、研发)划分多个队列,每个队列设置资源上限(如队列B最多使用集群50%资源)和优先级(如队列C优先级高于队列D)。
- 资源隔离:通过Container实现资源隔离,确保一个作业的资源使用不会干扰其他作业(如作业A占用2GB内存时,作业B无法突破该限制)。
- 队列优先级:高优先级队列的资源请求会被优先处理,避免关键任务(如实时监控)因资源不足而延迟。
4. 动态资源调整
YARN支持动态资源管理,以适应集群负载变化:
- 弹性调度:根据作业负载动态调整Container资源(如某作业从10个Container扩展到20个,或从2GB内存升级到4GB)。
- 资源抢占:当集群资源紧张时,高优先级作业可以抢占低优先级作业的资源(如队列E的高优先级作业可抢占队列F的低优先级作业的Container),确保关键任务执行。
5. 数据本地性与任务调度
YARN在资源分配时优先考虑数据本地性,减少数据传输开销:
- 节点本地性:优先将任务分配到数据所在节点(如HDFS数据块存储在Node1,任务尽量在Node1上运行)。
- 机架本地性:若节点本地性无法满足,则分配到同一机架的其他节点(如Node1与Node2在同一机架)。
- 非本地性:若以上两种方式均无法满足,则分配到任意节点(会增加网络传输开销,作为最后选择)。
6. 监控与预警
YARN通过监控工具(如Ambari、Ganglia)实时监控集群资源使用情况(如CPU利用率、内存占用、Container数量),并设置预警阈值(如CPU利用率超过80%时发出警报),帮助管理员及时发现资源瓶颈并调整策略。