YARN动态心跳
NodeManager采用固定频率心跳(默认1秒)向ResourceManager汇报状态。Yarn引入了动态心跳机制,NodeManager上报自身负载情况,由ResourceManager自动调节心跳发送间隔,通知NodeManager下次心跳时间。核心目标是考虑NodeManager负载情况,调节Container在NodeManager间的分配速度。
计算规则
增加基于NodeManager节点 CPU 利用率与集群整体 CPU 利用率对比,动态调整 ResourceManager和NodeManager心跳间隔的能力。
若某个NodeManager节点的利用率高于集群其他节点,则延长其心跳间隔。
若NodeManager节点利用率低于集群其他节点,则缩短其心跳间隔。
配置动态心跳
调整yarn-site.xml中配置参数:
配置参考
| 配置参数 | 参考值 | 描述 |
|---|---|---|
| yarn.resourcemanager.nodemanagers.heartbeat-interval-scaling-enable | true | 动态心跳总开关,是否允许ResourceManager基于集群节点负载自动调整所有NodeManager的心跳间隔。 |
| yarn.resourcemanager.nodemanagers.heartbeat-interval-min-ms | 500 | 设置动态心跳的最小间隔,单位毫秒。 |
| yarn.resourcemanager.nodemanagers.heartbeat-interval-max-ms | 2000 | 设置动态心跳的最大间隔,单位毫秒。 |
修改配置参数后,需要重启ResourceManager实例。
Timeline 数据存储调优
yarn.timeline-service.store-class配置YARN Timeline Service (YARN时间线服务) 中的存储实现,用于保存应用运行历史信息。LeveldbTimelineStore 和RollingLevelDBTimelineStore是其两种实现:
LeveldbTimelineStore:使用一个固定的LevelDB数据库文件存储所有数据,但是数据量大时性能下降。
RollingLevelDBTimelineStore:将数据按时间窗口分成多个LevelDB数据库,分片后性能更稳定。
配置参考
| 配置参数 | 参考值 | 描述 |
|---|---|---|
| yarn.timeline-service.store-class | org.apache.hadoop.yarn.server.timeline.RollingLevelDBTimelineStore | 默认org.apache.hadoop.yarn.server.timeline.LeveldbTimelineStore,数据库膨胀后性能下降,不适合生产大规模集群;org.apache.hadoop.yarn.server.timeline.RollingLevelDBTimelineStore将数据按时间窗口分成多个LevelDB数据库,通过滚动机制控制存储总量,超过保留期限的数据库会被自动删除。 |
| yarn.timeline-service.rolling-period | hourly | RollingLevelDBTimelineStore数据库滚动的时间窗口,有效值 daily, half_daily, quarter_daily, hourly, minutely。 |
| yarn.timeline-service.leveldb-timeline-store.ttl-interval-ms | 3600000 | 设置检查数据库过期的频率,单位毫秒。 |
| yarn.timeline-service.ttl-ms | 604800000 | Timeline存储的数据的存活时间,单位毫秒。 |
修改配置参数后,需要重启TimelineServer实例。
单次心跳分配多个Container
在YARN Capacity Scheduler 中,NodeManager会定期向 ResourceManager发送心跳来报告自身的资源状态(如内存、CPU等)。ResourceManager收到心跳后,会为该节点分配新的容器任务。若ResourceManager在每个心跳周期内,只为该节点分配一个容器。这意味着:如果一个节点有足够的空闲资源,并且有多个等待中的任务,ResourceManager每次心跳只能"塞"一个任务给它。这导致节点可能长时间处于资源闲置状态,因为需要等待下一个心跳周期才能获得新任务。
合理设置单个心跳分配的Container数可提升集群性能:
降低调度延迟:减少任务从提交到启动的等待时间,因为一个心跳周期可分配更多Container。
提升集群资源利用率:节点可以在一次心跳后快速被填满,避免周期性资源空转。
减少心跳交互次数:提升大规模集群下的调度性能,减轻RM 的通信负载。
配置参考
| 配置参数 | 参考值 | 描述 |
|---|---|---|
| yarn.scheduler.capacity.per-node-heartbeat.multiple-assignments-enabled | true | 是否允许在单个NodeManager 心跳中分配多个容器。 |
| yarn.scheduler.capacity.per-node-heartbeat.maximum-container-assignments | 5 | 单次心跳中最多可以分配的Container数量上限。 |
| yarn.scheduler.capacity.per-node-heartbeat.maximum-offswitch-assignments | 2 | 单次心跳中,允许分配到"非本地节点"(Off-Switch)的Container数量上限。 |
任务优先级设置
应用场景
集群的资源竞争场景如下:
1、提交两个低优先级的应用Job 1和Job 2。
2、正在运行中的Job 1和Job 2有部分task处于running状态,但由于集群或队列资源容量有限,仍有部分task未得到资源而处于pending状态。
3、提交一个较高优先级的应用Job 3,此时会出现如下资源分配情况:当Job 1和Job 2中running状态的task运行结束并释放资源后,Job 3中处于pending状态的task将优先得到这部分新释放的资源。
4、Job 3完成后,资源释放给Job 1、Job 2继续执行。
用户可以在YARN中配置任务的优先级。任务优先级是通过ResourceManager的调度器实现的。
配置参考
| 配置参数 | 参考值 | 描述 |
|---|---|---|
| yarn.cluster.max-application-priority | 10 | 定义集群中应用程序的最大优先级。如果提交的应用程序优先级高于此值,则会被重置为该最大值。 |
修改配置参数后,需要重启ResourceManager。
MapReduce客户端参数
| 配置参数 | 参考值 | 描述 |
|---|---|---|
| mapreduce.job.priority | DEFAULT | 有效配置值:VERY_HIGH、HIGH、NORMAL、LOW、VERY_LOW、DEFAULT。 |