tencent cloud

数据湖计算

产品动态
产品简介
产品概述
产品优势
应用场景
购买指南
计费概述
退费说明
欠费说明
调整配置费用说明
快速入门
新用户开通全流程
DLC 数据导入指引
一分钟入门 DLC 数据分析
一分钟入门 DLC 权限管理
一分钟入门分区表
开启数据优化
跨源分析 EMR Hive 数据
标准引擎配置指引
配置数据访问策略
操作指南
控制台操作介绍
开发指南
运行环境
SparkJar 作业开发指南
PySpark 作业开发指南
查询性能优化指南
UDF 函数开发指南
系统约束
客户端访问
JDBC 访问
TDLC 命令行工具访问
第三方软件联动
Python 访问
实践教程
通过 Power BI 访问 DLC 数据操作指南
建表实践
使用 Apache Airflow 调度 DLC 引擎提交任务
StarRocks 直接查询 DLC 内部存储
Spark 计算成本优化实践
DATA + AI
使用 DLC 分析 CLS 日志
使用角色 SSO 访问 DLC
资源级鉴权指南
在 DLC 中实现 TCHouse-D 读写操作
DLC 原生表
SQL 语法
SuperSQL 语法
标准 Spark 语法概览
标准 Presto 语法概览
保留字
API 文档
History
Introduction
API Category
Making API Requests
Data Table APIs
Task APIs
Metadata APIs
Service Configuration APIs
Permission Management APIs
Database APIs
Data Source Connection APIs
Data Optimization APIs
Data Engine APIs
Resource Group for the Standard Engine APIs
Data Types
Error Codes
通用类参考
错误码
配额与限制
第三方软件连接DLC操作指南
常见问题
权限类常见问题
引擎类常见问题
功能类常见问题
Spark 作业类常见问题
DLC 政策
隐私协议
数据处理和安全协议
服务等级协议
联系我们

自定义任务调度池

PDF
聚焦模式
字号
最后更新时间: 2024-07-31 17:48:28

使用场景

适用引擎:Spark SQL 引擎。
当您向引擎提交多个任务时,例如同时提交多个 SQL 任务到 Spark SQL 集群,由于业务提交的任务可能存在前后依赖,所以引擎在调度执行这些任务时,会默认按照 FIFO 的方式来调度这些任务。
但是某些特殊情况,可能您需要自己定义某些任务的优先级,例如以下场景:
提交的任务优先级很高,需要最高优先级执行这个任务,不希望它排队等待集群资源。
提交的任务优先级很低,希望这个任务尽量不抢占其他任务的资源,有资源时就执行,没资源时就排队等待。

自定义调度规则

在 Spark SQL 引擎中,每个执行的 SQL 任务 Job 都会被切分成多个 Task 的集合 TaskSet,我们的调度是基于 TaskSet 来调度的。每当集群有空闲资源时,就从所有 Job 的 TaskSet 中按调度算法取一个 Task 下发执行。
我们的调度算法就是定义多个调度池,将 Job/TaskSet 放在对应的调度池中,按调度池来获取需要下发执行的 Task。

调度池及其属性

您可以定义多个调度池,每个调度池有四个属性:
name:调度池的名称,您可以自己命名。可以命名为 default,表示默认的调度池。
schedulingMode:调度规则,支持 FIFO 和 FAIR 两种模式。一个调度池内有多个 TaskSet 时的调度算法。
FIFO:按照 TaskSet 提交的先后顺序依次下发。
FAIR:多个 TaskSet 的任务都公平地被下发。具体下发规则与调度池的 minShare 和 weight 属性有关。
minShare:最小满足的核数,必须大于0,也就是最小可以运行的 Task 数。在调度时会优先满足该调度池内运行的 Task 数目达到 minShare。
weight:权重。权重高的调度池,Task 会优先被调度。在满足 minShare 后才会对比权重。
调度的配置需要您撰写一个 xml 文件,格式如下:
<?xml version="1.0"?>
<allocations>
<pool name="production">
<schedulingMode>FAIR</schedulingMode>
<weight>1</weight>
<minShare>2</minShare>
</pool>
<pool name="test">
<schedulingMode>FIFO</schedulingMode>
<weight>2</weight>
<minShare>3</minShare>
</pool>
</allocations>

调度配置参考示例

您可以参考设置三个调度池:
默认调度池 default:schedulingMode = FIFO,weight = 1,minShare =(集群核数 - driver 核数)。该调度池是任务默认提交的调度池,优先级普通,按照先后顺序执行,可以使用集群全部的计算资源。
慢任务调度池 straggler:schedulingMode = FAIR,weight = 1,minShare = 1。该调度池专用于慢任务提交,优先级普通。由于minShare = 1,并不会抢占其他提交到 default 调度池的任务的资源。当集群有更多空闲资源时才会执行 straggler 调度池中的 Task。
高优调度池 special:schedulingMode = FIFO,weight = 1000,minShare =(集群核数 - driver 核数)。该调度池用于特殊情况需要优先执行的任务。但是,由于 minShare 的存在,该调度池并不会抢占集群全部资源,default 调度池中的任务仍然也会继续执行,一般情况下 default 池和 special 池各发下同等数量的 Task。
以16CU的集群(driver 为4CU)为例,这种参考示例的配置如下:
<?xml version="1.0"?>
<allocations>
<pool name="default">
<schedulingMode>FIFO</schedulingMode>
<weight>1</weight>
<minShare>12</minShare>
</pool>
<pool name="straggler">
<schedulingMode>FAIR</schedulingMode>
<weight>1</weight>
<minShare>1</minShare>
</pool>
<pool name="special">
<schedulingMode>FIFO</schedulingMode>
<weight>1000</weight>
<minShare>12</minShare>
</pool>
</allocations>

操作方式

1. 在准备好调度池的 xml 文件后,放置在 cos 的某个路径,例如 cosn://bucket-appid/fairscheduler.xml。
2. 在引擎配置中新增以下配置。

参数配置 spark.scheduler.allocation.file,取值为您的调度池 xml 文件路径 cosn://bucket-appid/fairscheduler.xml。

该操作需要重启集群。
3. 在任务提交时,指定以下参数作为任务参数。spark.scheduler.pool = 要提交到的调度池 name。如果是 default 调度池,可以不指定。


注意事项

调度发生的时间节点在:集群有空闲资源,而有任务需要调度时。因此,如果集群已经被某个任务,例如某个慢任务,全部占满后,必须等待该任务有一个 Task 执行完成,才会开始调度其他优先级更高的任务。所以需要注意,慢任务的单个 Task 耗时最好要相对合理,否则仍然可能会导致长时间占据集群资源。

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈