Hadoop的资源调度由YARN(Yet Another Resource Negotiator)负责,它是Hadoop 2.0及以上版本的核心组件,旨在解决Hadoop 1.0中“资源管理与作业调度耦合”的问题。YARN采用主从架构,主要包括以下组件:
YARN支持多种调度策略,适用于不同场景,核心策略如下:
特点:最简单的调度策略,所有作业按提交顺序进入单一队列,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>
特点:支持多队列资源划分,每个队列分配固定比例的资源(如生产队列占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
特点:以“公平”为核心目标,动态分配资源,确保所有作业都能获得大致相等的资源份额(如作业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>
通过以下参数调整单个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-mb
和yarn.nodemanager.resource.cpu-vcores
)。
对于支持动态资源分配的应用(如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>
http://resourcemanager-host:8088
查看队列使用情况、应用状态、资源分配趋势;yarn.log-aggregation-enable=true
);通过合理配置YARN调度策略,可显著提升Hadoop集群的资源利用率,保障各类作业的高效执行。