为DataWorks中的任务(节点)配置调度属性,包括调度周期、依赖关系、运行策略和参数,以确保任务按预期自动、可靠地执行。
核心概念
配置调度属性前,需理解以下核心概念:
任务与实例:任务(或称节点)是在DataWorks中开发的业务逻辑代码。当任务依据其调度配置运行时,会生成一个或多个运行实例。在运维中心,管理和监控的是任务的运行实例,例如查看日志、重跑实例等。
周期实例:对于周期性调度的任务,调度系统会根据其调度周期(如天、小时)生成对应的周期实例。例如,一个按小时调度的任务,每天会生成24个待运行的小时实例。
业务时间:实例所处理的数据对应的时间,通常为T-1(昨天)。例如,一个在2023-01-02凌晨运行的实例,其业务时间是2023-01-01,代表该实例正在处理1月1日的数据。调度参数的替换通常基于业务时间进行。
前提条件
已创建节点。DataWorks基于节点进行任务开发,不同类型的引擎任务在DataWorks上被封装为不同类型的节点,您可根据业务需要,选择合适的节点使用。详情请参见节点开发概述。
已在工作空间的调度设置页面开启启用调度周期开关。开启后,该工作空间下的所有任务才能根据其配置自动调度运行。详情参见配置工作空间调度属性。
配置调度属性
在节点编辑页面右侧的调度配置面板中,设置各项属性以定义任务的自动化行为。
1. 进入调度配置页面
进入DataWorks工作空间列表页,在顶部切换至目标地域,找到目标工作空间,单击操作列的快速进入> Data Studio,进入Data Studio。
在数据开发(Data Studio)界面,双击打开目标节点,进入其编辑页面。
单击节点编辑页面右侧的调度配置,打开配置面板。
2. 配置各项调度属性
调度配置面板包含调度时间、调度依赖、调度策略、调度参数、节点输出参数和关联角色等页签,根据业务需求进行配置。
调度时间:定义任务何时运行
定义任务何时、以何种频率自动执行。
如果节点位于工作流内,其调度时间由工作流统一配置,此处不可修改。如果节点是独立节点,则需在此处单独配置。
参数 | 说明 |
调度周期 | 定义任务在生产环境多久自动执行一次。支持分钟、小时、日、周、月、年等多种周期。
|
生效日期 | 设置任务自动调度的起止日期。超过有效期后,任务将不再生成新的周期实例。 |
Cron表达式 | 该表达式根据界面上的时间属性配置自动生成,无需手动配置。 |
调度时间 vs. 实际运行时间:此处配置的调度时间为任务的预期开始时间。任务的实际启动时间还受上游任务完成情况、资源组资源是否充足等多种因素影响。
非调度日的空跑机制:对于周、月、年调度的任务,在非指定的调度日期,系统会为其生成一个空跑实例。该实例会立即运行成功并触发下游任务,但自身不执行任何代码,也不消耗计算资源。
调度频率的独立性:任务的调度频率仅由其自身的调度周期决定,与上游任务的周期无关。DataWorks支持不同调度周期的任务(如小时任务依赖天任务)之间建立依赖关系。
调度依赖:定义任务的执行前提
定义当前任务必须等待哪些上游任务成功完成后才能开始执行。正确配置依赖是保障数据加工顺序和产出准确性的关键。
DataWorks基于代码中的表血缘关系,自动解析并推荐上游依赖以确保数据完整性。也可根据业务需要手动添加或修改依赖。
配置上游依赖
调度策略:定义任务的运行行为和资源
定义任务实例的生成方式、运行行为(如超时、重跑)和所需资源。
参数 | 说明 |
实例生成方式 | 定义任务发布后,周期实例何时开始生成。 |
调度类型 |
|
超时定义 | 设置任务运行的最长时长。超过该时间后,任务将自动终止并置为失败。默认值为3~7天,手动设置最大可为168小时(7天)。 |
重跑属性 | 定义任务在何种状态下允许被手动重跑。
|
失败自动重跑 | 开启后,当任务因临时性问题(如网络抖动)运行失败时,系统会自动尝试重跑,以提升调度稳定性。
说明 因超时而失败的任务不会触发自动重跑。 |
最大并行实例数 | 限制同一任务同时可运行的最大实例数,用于并发控制。取值范围为1-10000。开启后,超出数量的实例会排队等待,直到已有实例运行结束。 |
资源组 | 配置任务运行时使用的调度资源组。 |
计算资源/计算配额 | 配置任务运行所需的计算引擎资源(如MaxCompute Quota)。 |
数据集 | 为特定节点类型(如Shell)挂载数据集(如对象存储(OSS)或文件存储(NAS)),使其可以在代码中像本地文件一样访问。可配置挂载路径、高级配置(如读取方法)和只读权限。 |
参数配置:实现任务间动态传值
通过参数化配置,可以使任务代码更加灵活,实现任务间的动态传值和上下文传递。
调度参数(输入参数)
如果节点代码中使用了变量(例如 ${pt_time}),则需要在此处为其赋值。值可以是固定的常量,也可以是使用DataWorks内置参数(如 $bizdate)的动态表达式。
可通过添加参数手动定义,或通过加载代码中的参数自动识别。此外,还支持通过
图标将参数值与上游节点的输出参数进行绑定。
调度参数的最终取值,由实例的业务时间以及配置的调度参数表达式共同决定。
最佳实践:任务发布后,建议在生产环境的运维中心 > 周期任务界面,检查并确认生产任务的调度参数配置符合预期。
节点输出参数(输出参数)
定义当前节点的输出,以键值对(Key-Value)的形式供下游节点引用。下游节点可在其调度参数配置中,通过绑定上游节点的输出参数来消费这些值。
输出参数的参数值可以是常量(固定字符串),也可以是变量(引用系统或自定义的输入参数)。
支持的节点类型:
EMR Hive、EMR Spark SQL、ODPS Script、Hologres SQL、AnalyticDB for PostgreSQL和MySQL。传递查询结果:节点输出参数只能传递字符串值。如需将上游节点的SQL查询结果集传递给下游,请使用赋值节点。
关联角色:安全访问其他云资源
通过为任务指定一个RAM角色,使其在运行时能通过阿里云STS(Security Token Service)安全地获取临时访问凭证,从而访问其他云资源(如OSS),避免在代码中硬编码AccessKey,提升安全性。
功能限制
资源组限制:仅支持运行在Serverless 资源组的节点。
节点类型限制:仅支持Python、Shell、Notebook、PyODPS 2、PyODPS 3和PAI DLC节点。
1. 在节点中配置关联角色
在节点编辑界面的右侧,找到并单击运行配置。
在调度配置面板中,切换到关联角色页签。
在RAM角色下拉框中,选择您准备好的 RAM 角色。
重要如果下拉框为空,或找不到所需的角色,请参考配置关联角色(使用STS方式)访问其他云产品完成RAM角色配置。
配置完成后,提交节点。此配置仅对调试运行生效。
2. 运行与验证
PyODPS:访问其他云产品(如OSS)时,使用您设置的 RAM 角色身份;但访问 MaxCompute 数据时,仍然自动使用计算资源(项目级别)配置的访问身份。
配置调度属性
节点完成调试后,需将运行配置中的关联角色同步至调度配置的。发布后,任务将以该角色的身份运行。
若在运行配置中配置自定义镜像,需同步设置到调度配置中。
在运维中心查看执行角色
任务运行结束后,在运维中心查看任务实例的详细信息,以确认是否成功使用指定的角色。
进入。
找到您运行的节点实例,单击进入详情页。
在详情页中,查看执行身份字段,确认任务是否成功使用了指定的RAM角色。
3.(可选)查看或在代码中使用临时凭证
配置关联角色后,任务运行时会自动以该RAM角色身份访问其他云资源,通常无需在代码中显式获取凭证即可运行任务。
如果您需要在代码中显式使用临时凭证,或需要查看系统注入的临时凭证,可通过以下方式获取。DataWorks会在任务运行时自动获取临时凭证,并将其作为环境变量注入到运行环境中。
PAI DLC节点不支持通过本节所述方式获取临时凭证。
方式一:读取环境变量(推荐 Shell, Python)
系统会自动设置以下三个环境变量,您可以直接在代码中读取。
LINKED_ROLE_ACCESS_KEY_ID:临时访问密钥 ID。LINKED_ROLE_ACCESS_KEY_SECRET:临时访问密钥 Secret。LINKED_ROLE_SECURITY_TOKEN:临时安全令牌。
代码示例 (Python):
此案例在运行中需选择安装oss2的Python自定义镜像,相关操作请参见自定义镜像。
import os
import oss2
# 1. 从环境变量获取临时凭证
access_key_id = os.environ.get('LINKED_ROLE_ACCESS_KEY_ID')
access_key_secret = os.environ.get('LINKED_ROLE_ACCESS_KEY_SECRET')
security_token = os.environ.get('LINKED_ROLE_SECURITY_TOKEN')
# 检查是否成功获取
if not all([access_key_id, access_key_secret, security_token]):
raise Exception("Failed to get linked role credentials from environment variables.")
# 2. 使用临时凭证初始化 OSS 客户端
# 假设您已为角色授予了访问 'your-bucket-name' 的权限
auth = oss2.StsAuth(access_key_id, access_key_secret, security_token)
bucket = oss2.Bucket(auth, 'http://oss-<regionID>-internal.aliyuncs.com', 'your-bucket-name')
# 3. 使用客户端访问 OSS 资源
try:
# 列出 bucket 中的文件
for obj in oss2.ObjectIterator(bucket):
print('object name: ' + obj.key)
print("Successfully accessed OSS with linked role.")
except oss2.exceptions.OssError as e:
print(f"Error accessing OSS: {e}")代码示例 (Shell):
#!/bin/bash
access_key_id=${LINKED_ROLE_ACCESS_KEY_ID}
access_key_secret=${LINKED_ROLE_ACCESS_KEY_SECRET}
security_token=${LINKED_ROLE_SECURITY_TOKEN}
# 访问OSS,需替换regionID、bucket_name和file_name为真实信息
echo "ID:"$access_key_id
echo "token:"$security_token
ls -al /home/admin/usertools/tools/
# 示例为通过ossutil从OSS指定路径下载文件到本地test_dw.py,并输出文件内容。
/home/admin/usertools/tools/ossutil64 cp --access-key-id $access_key_id --access-key-secret $access_key_secret --sts-token $security_token --endpoint http://oss-<regionID>-internal.aliyuncs.com oss://<bucket_name>/<file_name> test_dw.py
echo "************************ 获取成功 ************************,打印结果"
cat test_dw.py方式二:使用 Credentials Client (推荐 Python)
代码示例 (Python):
此案例在运行中需选择安装oss2、alibabacloud_credentials的Python自定义镜像,相关操作请参见自定义镜像。
from alibabacloud_credentials.client import Client as CredentialClient
import oss2
# 1. 使用 SDK 自动获取凭证
# 它会自动查找环境变量中的 LINKED_ROLE_* 等凭证信息
cred_client = CredentialClient()
credential = cred_client.get_credential()
access_key_id = credential.get_access_key_id()
access_key_secret = credential.get_access_key_secret()
security_token = credential.get_security_token()
if not all([access_key_id, access_key_secret, security_token]):
raise Exception("Failed to get linked role credentials via SDK.")
# 2. 使用凭证初始化 OSS 客户端
auth = oss2.StsAuth(access_key_id, access_key_secret, security_token)
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', 'your-bucket-name')
# 3. 访问 OSS
print("Listing objects in bucket...")
for obj in oss2.ObjectIterator(bucket):
print(' - ' + obj.key)
print("Successfully accessed OSS with linked role via SDK.")后续步骤:提交与发布
调度配置在开发环境设置完成后并不会立即生效。必须将节点提交并发布到生产环境,调度系统才会根据最新配置,在生产环境中生成周期实例并自动执行任务。