温馨提示×

Linux中Hadoop如何进行资源调度

小樊
46
2025-09-23 06:38:02
栏目: 智能运维

Linux环境下Hadoop的资源调度机制与实践

一、Hadoop资源调度的核心组件:YARN

Hadoop的资源调度由YARN(Yet Another Resource Negotiator)负责,它是Hadoop 2.0及以上版本的核心组件,旨在解决Hadoop 1.0中“资源管理与作业调度耦合”的问题。YARN采用主从架构,主要包括以下组件:

  • ResourceManager(RM):集群全局资源管理器,负责接收资源请求、分配Container(资源容器)、监控NodeManager状态;
  • NodeManager(NM):每个节点的资源代理,负责管理本节点资源(CPU、内存)、启动/监控Container、向RM汇报资源使用情况;
  • ApplicationMaster(AM):每个应用程序的“管家”,负责向RM申请资源、协调任务执行(如MapTask/ReduceTask的调度)、监控任务状态;
  • Container:YARN的资源抽象单位,封装了CPU、内存等资源,为应用程序的任务提供隔离的运行环境。

二、YARN的主要资源调度策略

YARN支持多种调度策略,适用于不同场景,核心策略如下:

1. FIFO调度器(先进先出)

特点:最简单的调度策略,所有作业按提交顺序进入单一队列,RM优先为队列头部的作业分配资源,只有当前作业完成后,后续作业才能获得资源。
优点:实现简单,无额外配置成本,适合小规模集群或开发测试环境。
缺点:缺乏公平性,大作业可能长期占用资源,导致小作业长时间等待,资源利用率低。
适用场景:单用户、作业数量少、对执行顺序有严格要求的场景(如测试环境)。
配置方法:FIFO是YARN的默认调度器,无需修改yarn-site.xml;若需明确指定,可添加以下配置:

<property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler</value> </property> 

2. Capacity Scheduler(容量调度器)

特点:支持多队列资源划分,每个队列分配固定比例的资源(如生产队列占40%、开发队列占60%),队列内采用FIFO策略。同时支持队列嵌套(如生产队列下可划分“高优先级”“低优先级”子队列)和弹性资源分配(队列空闲时可借用其他队列的空闲资源)。
优点:严格的资源隔离,适合多租户共享集群(如企业级环境),能保障关键业务的资源需求。
缺点:资源分配灵活性不足,空闲资源共享效率较低(需手动配置弹性资源)。
适用场景:多部门、多项目共享的企业级集群,需要严格资源配额管理的场景。
配置实战

  • yarn-site.xml中启用容量调度器:
    <property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value> </property> 
  • capacity-scheduler.xml中定义队列结构与资源配额:
    <property> <name>yarn.scheduler.capacity.root.queues</name> <value>prod,dev</value> <!-- 根队列下有两个子队列:prod(生产)、dev(开发) --> </property> <property> <name>yarn.scheduler.capacity.root.prod.capacity</name> <value>40</value> <!-- 生产队列占根队列40%资源 --> </property> <property> <name>yarn.scheduler.capacity.root.prod.maximum-capacity</name> <value>70</value> <!-- 生产队列最多可占用集群70%资源(空闲时) --> </property> <property> <name>yarn.scheduler.capacity.root.dev.capacity</name> <value>60</value> <!-- 开发队列占根队列60%资源 --> </property> <property> <name>yarn.scheduler.capacity.root.dev.maximum-capacity</name> <value>90</value> <!-- 开发队列最多可占用集群90%资源(空闲时) --> </property> <property> <name>yarn.scheduler.capacity.root.prod.acl_submit_applications</name> <value>prod-team</value> <!-- 仅prod-team用户组可向生产队列提交任务 --> </property> 
  • 动态更新配置(无需重启集群):
    yarn rmadmin -refreshQueues 

3. Fair Scheduler(公平调度器)

特点:以“公平”为核心目标,动态分配资源,确保所有作业都能获得大致相等的资源份额(如作业A和作业B各占50%资源)。支持资源抢占(当某个作业占用过多资源时,RM可从该作业中抢占资源分配给其他作业),避免资源饥饿。
优点:公平性好,适合多用户、多作业的动态共享场景(如数据分析师同时提交多个查询任务),能提高集群整体利用率。
缺点:配置较复杂,资源抢占可能影响正在运行的任务。
适用场景:多用户、作业优先级不同、需要公平分配资源的场景(如数据实验室、共享开发环境)。
配置实战

  • yarn-site.xml中启用公平调度器并指定配置文件:
    <property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value> </property> <property> <name>yarn.scheduler.fair.allocation.file</name> <value>/usr/local/hadoop/etc/hadoop/fair-scheduler.xml</value> <!-- 指定公平调度器配置文件路径 --> </property> <property> <name>yarn.scheduler.fair.preemption</name> <value>true</value> <!-- 启用资源抢占 --> </property> 
  • 新建fair-scheduler.xml配置队列资源:
    <?xml version="1.0"?> <allocations> <queue name="default"> <minResources>1024mb,10vcores</minResources> <!-- 默认队列最小资源 --> <maxResources>2048mb,20vcores</maxResources> <!-- 默认队列最大资源 --> <weight>1.0</weight> <!-- 队列权重(默认1.0) --> </queue> <queue name="high_priority"> <minResources>2048mb,20vcores</minResources> <!-- 高优先级队列最小资源 --> <maxResources>4096mb,40vcores</maxResources> <!-- 高优先级队列最大资源 --> <weight>2.0</weight> <!-- 权重更高,优先获得资源 --> </queue> <user name="data_analyst"> <maxRunningApps>5</maxRunningApps> <!-- data_analyst用户最多同时运行5个应用 --> </user> </allocations> 

三、资源调度配置与优化技巧

1. Container资源限制

通过以下参数调整单个Container的最大资源量,避免单个任务占用过多资源:

<property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>8192</value> <!-- 单个Container最大内存(MB) --> </property> <property> <name>yarn.scheduler.maximum-allocation-vcores</name> <value>8</value> <!-- 单个Container最大CPU核数 --> </property> 

需确保这些值不超过节点的实际资源(如NodeManager的yarn.nodemanager.resource.memory-mbyarn.nodemanager.resource.cpu-vcores)。

2. 启用动态资源分配

对于支持动态资源分配的应用(如Spark、Flink),开启该功能可使应用根据实际负载请求/释放资源,提高资源利用率:

<property> <name>yarn.scheduler.dynamic-resource-allocation.enabled</name> <value>true</value> </property> <property> <name>yarn.scheduler.dynamic-resource-allocation.min-alloc-mb</name> <value>512</value> <!-- 最小分配内存 --> </property> <property> <name>yarn.scheduler.dynamic-resource-allocation.max-alloc-mb</name> <value>4096</value> <!-- 最大分配内存 --> </property> 

3. 监控与调优

  • YARN Web UI:通过http://resourcemanager-host:8088查看队列使用情况、应用状态、资源分配趋势;
  • 日志聚合:开启日志聚合功能,方便故障排查(yarn.log-aggregation-enable=true);
  • 生产经验:根据集群负载调整队列资源配额(如高峰时段增加生产队列资源)、定期清理闲置应用(避免资源浪费)。

四、调度策略的选择建议

  • 若为小规模集群/开发测试环境,选择FIFO调度器(简单易用);
  • 若为企业级多租户集群,选择容量调度器(严格资源隔离);
  • 若为多用户动态共享场景,选择公平调度器(公平分配资源)。

通过合理配置YARN调度策略,可显著提升Hadoop集群的资源利用率,保障各类作业的高效执行。

0