Node Labels是YARN提供的节点分区功能,使得YARN在调度时能够在物理层面上对不同类型的作业进行有效隔离。本文为您介绍如何根据您的业务类型和节点类型创建相应的Node Labels。
背景信息
YARN提供的队列(Queue)与节点分区(Node Labels)是资源管理与调度中两项重要策略。它们各自承担着不同的角色,并在集群资源管理中发挥着独特的作用。
-
Queue是一种逻辑资源划分方式,允许将集群的计算资源按照预先设定的比例分配给不同的用户组或应用程序。通过这种方式,可以确保即使在共享的集群环境中,不同团队或不同类型的工作负载也能够公平地获得所需的资源。
-
Node Labels提供了一种机制,用于标识集群中的特定节点,并基于这些标签执行更为细致的资源分配决策。这对需要利用特定硬件特性(例如GPU或者大内存节点)的应用程序尤为重要。
Queue主要关注资源的分配与作业的调度,而Node Labels则着重于节点的分组及作业的物理位置。因此,在实际应用中,Queue与Node Labels能够有效结合,以实现更灵活且高效的资源管理与作业调度。
用户可以根据自身的业务需求和集群状况,选择合适的节点分区划分方式,以便有效管理和调度集群资源。Node Labels的常见划分方式可依据业务团队的业务类型(如数据同步任务、批处理任务、实时处理任务等)以及集群节点的实例类型(如CPU型、内存型、GPU计算型等)进行划分。
前提条件
-
已创建带YARN服务的集群,详情请参见创建集群。
-
集群YARN的调度器选择了Capacity Scheduler,目前仅有Capacity Scheduler调度器支持Node Labels的分区调度。
应用示例
示例背景
某公司根据业务团队的资源需求,将集群队列划分为数据仓库队列(warehouse)和数据分析队列(analysis),并将集群资源分为批处理(batch)和流处理(streaming)两个分区。其中,数据仓库团队将利用60%的批处理资源和70%的流处理资源,而数据分析团队则将使用30%的批处理资源和20%的流处理资源。此外,未打标签的资源中,数据仓库占比为60%,数据分析队列的资源占比为30%,并预留10%的资源供其他需求使用。具体划分情况请参见下图。
本示例将采用队列与标签相结合的方式,以实现灵活的资源管理,并对离线任务进行物理隔离,从而确保不影响其他任务的性能与稳定性。以下步骤均在集群EMR-5.16.0版本的数据湖集群类型下实施,其它集群的操作步骤亦具有相似性。
步骤一:编辑资源队列
-
登录EMR on ECS控制台,单击目标集群操作列表下集群服务,在这个页面,找到YARN服务并单击进入。
-
在YARN服务页面,单击编辑资源队列,在这个页面单击管理队列。
-
在管理子队列页面,新增数据仓库团队warehouse队列和数据分析团队analysis队列。
-
warehouse队列容量占比为60%,analysis队列容量占比为30%,余下10%给default队列,状态都选择为开启。
-
配置完之后,页面显示如下。
编辑资源队列页面显示当前调度器类型为 capacity-scheduler,root 队列下包含三个子队列:analysis(队列容量 30%,最大 100%)、warehouse(队列容量 60%,最大 100%)、default(队列容量 10%,最大 100%),三个队列状态均为运行中。页面顶部 YARN 服务旁出现待生效标签,表示配置变更尚未部署生效。
-
-
单击待生效,在待生效配置页面单击refresh_queues,完成队列配置。
在弹窗的 自定义生效方式配置 表格中,找到组件名为 ResourceManager、配置文件为
capacity-scheduler.xml对应的行。
步骤二:创建节点分区
-
单击管理分区,在这个页面单击新增分区,新增streaming分区。
-
在新增分区页面,填写分区名称,选择分区类型,选择需要关联节点组。
参数
说明
分区名称
当前示例分区名称是streaming。
分区类型
当前示例选择exclusive,表示只允许请求和该分区匹配的容器调度到该分区的节点上。
关联节点组
当前示例streaming分区关联emr-task-3。当前集群emr-task-3节点实例类型是内存型,适合运行需要存储大量中间数据、低延迟的实时任务。关联节点组的分配需要结合各自业务的特点与节点实例类型进行合理分配。
-
-
重复上述步骤完成batch分区新增,最终结果如下。
完成所有分区创建后,管理分区页面的分区列表包含三个分区:DEFAULT_PARTITION(可访问队列为全部队列,节点组为 emr-core,分区类型为 Exclusive)、streaming(可访问队列为 root 和 root.default,节点组为 emr-task-3,分区类型为 Exclusive)、batch(可访问队列为 root 和 root.default,节点组为 emr-task-1 和 emr-task-2,分区类型为 Exclusive)。此时顶部导航栏出现橙色待生效状态标识,需单击部署生效使配置生效。
-
新增完分区之后,单击待生效,在待生效配置页面,单击refresh_labels,完成节点分区配置。
在 自定义生效方式配置 区域,ResourceManager 组件对应的配置文件为
node-labels.xml。 -
配置生效之后,可以看到每个分区下的资源总量。
例如,streaming分区的资源总量显示为
<memory:4096, vCores:8>,batch分区的资源总量显示为<memory:8192, vCores:16>。
步骤三:启用分区和队列关联管理
-
在编辑资源队列页面,依次选择batch和streaming分区,并单击启用分区和队列关联管理。
-
启用分区和队列关联管理对话框,配置各分区下的队列容量占比。
-
batch分区analysis队列容量占比为30%,warehouse队列容量占比为60%, default队列容量占比为10%。
-
streaming分区analysis队列容量占比为20%,warehouse队列容量占比为70%, default队列容量占比为10%。
说明在本示例中,所有队列均具备在各分区运行的权限。在实际配置中,您可以将特定分区下某队列的容量占比设置为0,以确保该分区仅能运行由指定队列提交的任务。
-
-
配置完启用分区和队列关联管理后,单击待生效,在待生效配置页面,单击refresh_queues,完成启用分区和队列关联管理。
-
在YARN的WEB UI页面上检查节点分区是否已生效。
-
Node Labels页面
该页面的表格包含 Label Name、Label Type、Num Of Active NMs、Total Resource 四列,显示三条记录:
<DEFAULT_PARTITION>(Exclusive Partition,2 个活跃 NM,资源 memory:8192, vCores:16)、batch(Exclusive Partition,2 个活跃 NM,资源 memory:8192, vCores:16)、streaming(Exclusive Partition,1 个活跃 NM,资源 memory:4096, vCores:8)。 -
Scheduler页面
在 Scheduler 页面的 Application Queues 区域,已配置三个分区:DEFAULT_PARTITION(
<memory:8192, vCores:16>)、Partition: batch(<memory:8192, vCores:16>)和 Partition: streaming(<memory:4096, vCores:8>)。其中 batch 和 streaming 两个节点标签分区下均包含 root 队列,子队列为 default、warehouse、analysis。Scheduler 类型为 Capacity Scheduler,Minimum Allocation 为<memory:32, vCores:1>,Maximum Allocation 为<memory:4096, vCores:8>。
-
步骤四:提交任务到指定分区
您已经完成集群队列和标签的设置,现在可以提交任务到指定队列和指定节点运行了。
-
请登录到集群的master节点,进入Spark的安装目录,例如/opt/apps/SPARK3/spark-3.3.1-hadoop3.2-1.1.1。
cd /opt/apps/SPARK3/spark-3.3.1-hadoop3.2-1.1.1 -
在实际业务中,您需要上传所需任务的JAR包以提交Spark任务。本测试案例展示了如何使用spark-submit提交任务。
./bin/spark-submit --class org.apache.spark.examples.SparkLR --master yarn --deploy-mode cluster --driver-memory 1g --executor-memory 2g --conf spark.yarn.am.nodeLabelExpression=batch --conf spark.yarn.executor.nodeLabelExpression=batch --queue=warehouse examples/jars/spark-examples_2.12-3.3.1.jar参数
说明
class
应用程序的主类:org.apache.spark.examples.SparkLR。
master
提交任务的执行位置:yarn。
deploy-mode
设置driver启动的位置:cluster。
driver-memory
Driver内存:1g。
executor-memory
每个 executor 的内存:2g。
spark.yarn.am.nodeLabelExpression
应用程序主节点运行于该标签上:batch。
spark.yarn.executor.nodeLabelExpression
执行器运行于该节点分区上:batch。
queue
提交作业到特定的YARN队列:warehouse。
说明如果您提交任务仅指定队列,未指定分区,任务将提交到指定队列的默认分区。队列的默认分区您可以在编辑资源队列页面,编辑您想修改队列的默认分区。
-
在YARN集群的WEB UI页面进行验证时,可以观察到SparkLR任务已成功提交至YARN的warehouse队列,并且被分配至batch分区进行执行。
通过对YARN的队列和节点分区进行配置,可以实现用户特定业务在资源方面的逻辑与物理隔离,从而有效避免业务之间的相互干扰,确保特定业务的性能与稳定性。
常见问题
-
在使用spark-submit提交Spark任务时,发现该任务未能在指定的分区上运行。
-
检查提交任务的命令是否已添加spark.yarn.executor.nodeLabelExpression参数。
-
请确认管理分区与编辑资源队列的设置是否生效。
-
-
在使用spark-submit提交Spark任务时,发现该任务的状态始终显示为ACCEPTED。
-
请确认该任务提交的队列上是否存在可用资源。如果未发现可用资源,请耐心等待其他任务完成并释放资源后再进行提交。
-
如果该队列仍有可用资源,在YARN的WEB UI页面中,单击相应的任务ID以进入任务详情页面,查看Diagnostics描述,您将看到提示:“Queue's AM resource limit exceeded”。这表明队列虽然具备资源,但AM资源不足。队列的资源将被分配给AM和EXECUTOR,其中AM资源用于提交主程序,而留给EXECUTOR的资源则用于任务处理。因此,有必要对队列资源的分配比例进行调整,适当提高AM资源的比例,以确保Spark任务能够顺利提交。
Diagnostics: [Wed Dec 25 16:24:10 +0800 2024] Application is added to the scheduler and is not yet activated. Queue's AM resource limit exceeded. Details : AM Partition = <DEFAULT_PARTITION>; AM Resource Request = <memory:2048, vCores:1>; Queue Resource Limit for AM = <memory:2048, vCores:4>; User AM Resource Limit of the queue = <memory:224, vCores:1>; Queue AM Resource Usage = <memory:896, vCores:1>; -
AM资源比例的调整可以在YARN服务的配置页面找到capacity_scheduler.xml文件,通过修改yarn.scheduler.capacity.maximum-am-resource-percent配置项的值来实现,例如将其从0.25调整至0.5。
说明yarn.scheduler.capacity.maximum-am-resource-percent队列默认的AM可用比例应根据具体业务场景进行合理调整。例如,在集群中存在大量处理小数据量任务的情况下,可以适当提高AM的可用比例。
-
相关文档
-
YARN调度相关原理,详情参见YARN调度器。
-
YARN节点分区相关原理,详情参见Node Labels特性使用。