都是default惹的祸-yarn调度(一)-fair调度器drf调度策略作业不执行问题的调查和源码分析

本文涉及的产品
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: 问题背景 yarn的fair类型资源池,是企业级hadoop用户常用的资源池类型。该资源池默认的队列调度策略是fair,即分配资源时只考虑内存限制。 对一个多个团队混合使用的大集群来说,如果想要在分配资源时同时考虑内存和cpu限制,需要指定调度策略为drf。

本文主要记录了fair调度器drf调度策略作业不执行问题的解决过程,重点介绍了调查方法和调查过程细节,希望对大家了解fair调度器有所帮助 。

除本人知乎专栏外,转载请联系我。

一.问题背景

yarn的调度器有capacity和fair两种,之间的区别可以自行谷歌。fair调度器(附录1)是企业级hadoop用户常用的资源池类型,该调度器默认的队列内部调度策略(SchudelingPolicy)是fair,即分配资源时只考虑内存限制。

对一个跨部门多个团队共同使用的大集群来说,如果存在cpu密集型作业,不进行cpu控制肯定会影响其他作业的运行。想要在分配资源时同时计算内存和cpu限制,需要指定队列的调度策略为drf,即DominantResourceFainessPolicy(附录2)。一般配合cgroup使用,控制容器实际的cpu资源(附录3)。

使用drf时遇到一个问题,配置非常简单的一个fair-scheduler示例,但作业提交后不分配资源。

配置如下:

bf2b818e9437acb4b4744881e48bf424d8a45054

运行wordcount卡住

c27d4740fd3694e82d050f8dd7e5a2b5db64ac55

将调度策略由drf改成fair或不设置(默认还是fair),作业运行正常

87b440fdfb55f083b6416e4574c05be6abf1d8e8

下面详细分析调查过程,不关心分析过程的可直接看五.结论章节。

二.发现表象原因

1. 查fair官网文档,没发现有什么问题。

2. 搜谷歌,没找到类似问题。搜github hadoop的issue,也没找到类似问题。

3. 看了官网文档和其他技术网站的各种示例,灵光一闪,将queue的name从default换成root,作业运行正常了。难道是不能叫default?

4. 尝试queue的name为“defaul”等等,作业都正常。就是default不行。但调度策略换回fair后,default可以。

5. 搜hadoop源码,没找到有类似对default做特殊业务处理的地方。

6. 测试集群用的emr-hadoop 2.7.2版本,是hadoop定制版。换成apache原生的hadoop 2.7.2,queue名字为default作业也不运行。说明原生hadoop也有同样问题。


那么为什么队列叫default作业就不运行呢

 

三.深入调查的方法

通过加打印日志的方式定位问题。

1. 下载hadoop源码(附录四),fair调度器的源码在./hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager子项目下,org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair包里。

2. 参考一些源码分析的文章(附录五,六,七)看fair调度器的源码,在合适的地方加打印日志。

3. 对子项目打包,执行mvn package –DskipTests,target目录下生成hadoop-yarn-server-resourcemanager-2.7.2.jar。

4. 上传到服务器,代替hadoop目录下的share/hadoop/yarn/hadoop-yarn-server-resourcemanager-2.7.2.jar。

5. 重启resourcemanager。

6. 修改fair-scheduler的配置,提交作业,查看resourceManager的日志输出。

四.调查过程

4.1作业为什么不执行

FSLeafQueue类的updateDemand()方法会刷新子队列的资源请求,加打印如图,查看队列实时资源,队列名,调度策略,最大资源,作业信息等。

0c8997488ed642a58952901c08839490afb7b1a8

看日志发现,

1. 不管配置文件的队列名是什么,作业都提交给了root.default这个队列。说明作业默认都是提交到这个队列。

2. 该队列的实时资源fairShare只有内存,vcores一直是0.

3. 当配置文件显式配置了default队列调度策略为drf时,root.default队列的调度策略为drf。作业申请AM要一个vcores资源,没资源一直等待。

4. 当配置文件没显式配置default时,root.default队列的调度策略为默认的fair,作业申请AM只计算内存资源,成功分配资源。


那么只有root.default这个队列会vcores一直为0吗?

配置文件设置另一个队列test,调度策略为drf,作业提交时指定test队列:

hadoop jar /opt/apps/ecm/service/hadoop/2.7.2-1.2.14/package/hadoop-2.7.2-1.2.14/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar 

wordcount -D mapreduce.job.queuename=test /apps/tez-0.9.1/NOTICE count10



发现依然vcores为0,作业一直等待。

作业不执行的原因确定了,是队列一直没有vcores资源。drf调度策略,am需要一个vcores资源,没有就一直等待资源。那为什么所有队列都没有vcores资源呢?

4.2.队列为什么没有vcores资源

继续加打印,FairScheduler类的update()方法会更新各队列的资源分配,加打印查看root根队列的集群资源。

d76e69e99016a94ad6adf5a6f6149547e9bc247c

ComputeFairShares类的computeShares()方法会计算队列内部各子队列/作业的资源分配,加打印。

b1d7be3722967dd282843d93956bf0c786cde129

日志看到,root根队列的集群资源是有vcores的,但root.default队列一直没有分配到vcores资源!


继续加打印,FSLeafQueue类和FSParentQueue类的recomputeShares()方法是重新计算队列内部资源的入口,加打印。

b05f87440c186bf0e8f55f80d035c456b60b877d

7119b1c90aa0c06fff5af6a3ccd0777cd25541dd

终于发现问题了,root根队列调度策略是默认的fair,给子队列分配资源时,FairSharePolicy类的computeShares()方法只会分配内存类型的资源,所以root.default队列只有内存资源,一旦配置子队列调度类型为drf计算vcores资源,会因为没有vcores资源一直等待。

f0607a79f7a40831e6a7a769028b19ba5be3951d


验证,配置文件配置root和default两个队列,调度策略都是drf。提交作业到default队列,正常运行,日志显示default队列分配到了vcores资源。

ed4595812c40f74b9fd3de9277cbd5bcc558ee22

4.3.调度器初始化细节

QueueManager类的initialize()方法,会用队列默认属性初始化了一个root根队列,和一个root.default子队列。

c9791bfff60dc13d8290d024a4ac96a00db1bf8b

配置文件里写的队列名的规则是如果不是以root.开头或就是root,就增加“root.”前缀放到root根队列下。

91acae11b1fda2914f8717ce9c5194f7b1559b3b


读配置文件时,如果有root队列或default/root.default队列,会覆盖这两个队列的默认配置

五.结论

如果想用drf调度策略计算vcores资源,那么必须从root根队列递归到叶子队列,显式配置所有队列调度策略都为drf。如果父队列没配置用了默认fair,那么只会给子队列分配内存资源,子队列用drf调度策略作业就都会没资源卡住。

六.Fair调度器源码详解

待补充

七.附录

1. fair调度器官方文档

2. yarn公平调度drf算法

3. yarn的cpu资源隔离

4. hadoop源码

5. fair调度器的资源分配机制

6. fair调度器源码分析

7. 计算fairshare源码分析


相关实践学习
基于EMR Serverless StarRocks一键玩转世界杯
基于StarRocks构建极速统一OLAP平台
快速掌握阿里云 E-MapReduce
E-MapReduce 是构建于阿里云 ECS 弹性虚拟机之上,利用开源大数据生态系统,包括 Hadoop、Spark、HBase,为用户提供集群、作业、数据等管理的一站式大数据处理分析服务。 本课程主要介绍阿里云 E-MapReduce 的使用方法。
目录
相关文章
|
资源调度 分布式计算 Java
Yarn资源调度器
Yarn资源调度器
57 0
|
2月前
|
资源调度 分布式计算 Hadoop
使用YARN命令管理Hadoop作业
本文介绍了如何使用YARN命令来管理Hadoop作业,包括查看作业列表、检查作业状态、杀死作业、获取作业日志以及检查节点和队列状态等操作。
46 1
使用YARN命令管理Hadoop作业
|
2月前
|
分布式计算 资源调度 Hadoop
Hadoop YARN资源管理-容量调度器(Yahoo!的Capacity Scheduler)
详细讲解了Hadoop YARN资源管理中的容量调度器(Yahoo!的Capacity Scheduler),包括队列和子队列的概念、Apache Hadoop的容量调度器默认队列、队列的命名规则、分层队列、容量保证、队列弹性、容量调度器的元素、集群如何分配资源、限制用户容量、限制应用程序数量、抢占申请、启用容量调度器以及队列状态管理等方面的内容。
71 3
|
2月前
|
分布式计算 资源调度 Hadoop
Hadoop YARN资源管理-公平调度器(Fackbook的Fair Scheduler)
详细介绍了Hadoop YARN资源管理中的公平调度器(Fair Scheduler),包括其概述、配置、队列结构、以及如何将作业提交到指定队列,展示了公平调度器如何通过分配文件(fair-scheduler.xml)来控制资源分配,并提供了配置示例和如何通过命令行提交作业到特定队列的方法。
116 0
Hadoop YARN资源管理-公平调度器(Fackbook的Fair Scheduler)
|
3月前
|
资源调度 分布式计算 算法
【揭秘Yarn调度秘籍】打破资源分配的枷锁,Hadoop Yarn权重调度全攻略!
【8月更文挑战第24天】在大数据处理领域,Hadoop Yarn 是一种关键的作业调度与集群资源管理工具。它支持多种调度器以适应不同需求,默认采用FIFO调度器,但可通过引入基于权重的调度算法来提高资源利用率。该算法根据作业或用户的权重值决定资源分配比例,权重高的可获得更多计算资源,特别适合多用户共享环境。管理员需在Yarn配置文件中启用特定调度器(如CapacityScheduler),并通过设置队列权重来实现资源的动态调整。合理配置权重有助于避免资源浪费,确保集群高效运行,满足不同用户需求。
49 3
|
3月前
|
资源调度 分布式计算 Hadoop
揭秘Hadoop Yarn三大调度器:如何玩转资源分配,实现高效集群管理?
【8月更文挑战第24天】Hadoop YARN(Another Resource Negotiator)是一款强大的集群资源管理工具,主要负责高效分配及管理Hadoop集群中的计算资源。本文深入剖析了YARN的三种调度器:容量调度器(Capacity Scheduler)、公平调度器(Fair Scheduler)以及FIFO调度器,并通过具体的配置示例和Java代码展示了它们的工作机制。
62 2
|
3月前
|
图形学 C# 开发者
Unity粒子系统全解析:从基础设置到高级编程技巧,教你轻松玩转绚丽多彩的视觉特效,打造震撼游戏画面的终极指南
【8月更文挑战第31天】粒子系统是Unity引擎的强大功能,可创建动态视觉效果,如火焰、爆炸等。本文介绍如何在Unity中使用粒子系统,并提供示例代码。首先创建粒子系统,然后调整Emission、Shape、Color over Lifetime等模块参数,实现所需效果。此外,还可通过C#脚本实现更复杂的粒子效果,增强游戏视觉冲击力和沉浸感。
149 0
|
4月前
|
SQL 缓存 资源调度
实时计算 Flink版产品使用问题之在Flink on Yarn模式下,如何对job作业进行指标监控
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5月前
|
资源调度 分布式计算 安全
YARN的FIFO调度器和Capacity Scheduler调度器在资源分配上有何区别?
【6月更文挑战第20天】YARN的FIFO调度器和Capacity Scheduler调度器在资源分配上有何区别?
69 11
|
5月前
|
资源调度 分布式计算 Hadoop
YARN中的资源调度主要通过其调度器(Scheduler)实现
【6月更文挑战第20天】YARN中的资源调度主要通过其调度器(Scheduler)实现
60 5