DataWorks 重点难点

时间:2023-02-13 11:19:32

1 调度参数

参数类型

类型定义

 参数名称

名称定义

内置参数

在代码中直接获取业务日期或定时时间

$bizdate

业务日期,格式为yyyymmdd。该参数的应用较为广泛,日常调度中默认任务预期运行时间的前一天为业务日期

$cyctime

任务的定时时间,格式为yyyymmddhh24miss

$gmtdate

当前日期,格式为yyyymmdd。该参数默认取当天日期,执行补数据操作时输入的日期为业务日期+1

$bizmonth

业务月份,格式为yyyymm。如果业务日期的月份与当前月份一致,则业务日期月份。如果业务日期的月份与当前月份不一致,则bizmnotallow=业务日期月份。

$jobid

任务所属的业务流程ID

$nodeid

节点ID

$taskid

节点产生的实例ID

自定义参数

支持您在代码中根据业务需求自定义变量名称,再通过调度配置 > 参数赋值区域,统一为代码中的变量赋值自定义的调度参数格式,从而动态获取不同格式的时间参数

${...}

基于系统内置参数$bizdate,通过yyyy、yy、mm和dd自定义组合而生成的时间参数

$[...]

基于系统内置参数$cyctime,通过yyyy、yy、mm、dd、hh24、mi和ss自定义组合而生成的时间参数

常量

支持在赋值区域为变量赋值常量。例如,"abc"、1234

自定义参数${...},具体示例:

前/后N年${yyyy±N}

前/后N月${yyyymm±N}

前/后N周${yyyymmdd±7*N}

前/后N天${yyyy±N}

年月日加/减N天${yyyy±N}

加/减N年(yyyy格式)${yyyy±N}

加/减N年(yy格式)${yy±N}

业务月第一天${yyyymm}01

业务月上月第一天${yyyymm-1}01

其中:

  • yyyy:表示4位的年份,取值为$bizdate的年份。
  • yy:表示2位的年份,取值为$bizdate的年份。
  • mm:表示月份,取值为$bizdate的月份。
  • dd:表示天,取值为$bizdate的天。

自定义参数$[...],具体示例:

前/后N年$[add_months(yyyymmdd±12*N)]

前/后N月$[add_months(yyyymm±N]

前/后N周$[yyyymmdd±7*N]

前/后N天$[yyyymmdd±N]

前/后N小时$[自定义时间格式±N/24]

前/后N分钟$[自定义时间格式±N/24/60]

其中:

  • yyyy:表示4位的年份,取值为$cyctime的年份。
  • yy:表示2位的年份,取值为$cyctime的年份。
  • mm:表示月份,取值为$cyctime的月份。
  • dd:表示天,取值为$cyctime的天。
  • hh24:表示小时(12进制使用hh),取值为$cyctime的小时。
  • ss:表示秒,取值为$cyctime的秒。
  • mi:表示分钟,取值为$cyctime的分钟。

具体细节请参见阿里云官方文档 调度配置

2 MaxCompute客户端-odpscmd

   该客户端的主要功能是在于弥补网页端的不足之处,因为安全性等因素,网页端是限制上传(超过30MB的文件)和下载(超过1W条记录)的,因此通过该客户端来进行下载和上传大量数据的功能。

2.1 odpscmd客户端下载

   下载需要在github上下载,有的时候可能会登录不上或者下载很慢的情况,点击github下载地址 ,或者使用本地已下载版本,点击odps客户端

2.2 odpscmd安装包

   解压下载的安装包文件,得到bin、conf、lib和plugins文件夹。

2.3 odpscmd安装包

   进入conf文件夹,配置odps_config.ini文件。odps_config.ini文件内容如下:

project_name=
access_id=
access_key=
end_point=
log_view_host=
https_check=
# confirm threshold for query input size(unit: GB)
data_size_cnotallow=
# this url is for odpscmd update
update_url=
# download sql results by instance tunnel
use_instance_tunnel=
# the max records when download sql results by instance tunnel
instance_tunnel_max_record=
# IMPORTANT:
# If leaving tunnel_endpoint untouched, console will try to automatically get one from odps service, which might charge networking fees in some cases.
# Please refer to Endpoint
# tunnel_endpoint=

# use set.<key>=
# e.g. set.odps.sql.select.output.format=

odps_config.ini文件中使用井号(#)作为注释。参数详细信息如下。

参数

是否必填

描述

示例

project_name

访问的目标MaxCompute项目名称。如果您创建了标准模式的工作空间,在配置project_name时,请注意区分生产环境与开发环境(_dev)的项目名称,请参见简单模式和标准模式的区别。您可以登录MaxCompute控制台,在项目管理页签获取MaxCompute项目名称。

doc_test_dev

access_id

阿里云账号或RAM用户的AccessKey ID。您可以进入AccessKey管理页面获取AccessKey ID。

access_key

AccessKey ID对应的AccessKey Secret。您可以进入AccessKey管理页面获取AccessKey Secret。

end_point

MaxCompute服务的连接地址。您需要根据创建MaxCompute项目时选择的地域以及网络连接方式配置Endpoint。各地域及网络对应的Endpoint值,请参见Endpoint。

​http://service.cn-hangzhou.maxcompute.aliyun.com/api​

log_view_host

Logview地址。您可以通过该地址查看作业的详细运行信息,并为报错处理提供依据。固定取值为:http://logview.odps.aliyun.com。

​http://logview.odps.aliyun.com​

https_check

是否开启HTTPS访问机制,对访问MaxCompute项目的请求进行加密。取值范围如下:True:采用HTTPS机制。False:采用HTTP机制。默认值为False。

TRUE

data_size_confirm

输入数据量的最大值,单位为GB。取值范围无限制。推荐设置为100 GB。

100

update_url

预留参数,暂无需关注

use_instance_tunnel

是否使用InstanceTunnel下载SQL执行结果。取值范围如下:True:使用InstanceTunnel下载SQL执行结果。False:不使用InstanceTunnel下载SQL执行结果。默认值为False。

TRUE

instance_tunnel_max_record

客户端返回的SQL执行结果的最大记录数。如果use_instance_tunnel值为True,需要配置该参数。最大值为10000。

10000

tunnel_endpoint

Tunnel服务的外网访问链接。如果您未配置Tunnel Endpoint,Tunnel会自动路由到MaxCompute服务所在网络对应的Tunnel Endpoint。如果您配置了Tunnel Endpoint,则以配置为准,不进行自动路由。各地域及网络对应的Tunnel Endpoint值,请参见Endpoint。

​http://dt.cn-hangzhou.maxcompute.aliyun.com​

set.<key>

设置MaxCompute项目的属性。

et.odps.sql.decimal.odps2=true

2.4 运行odpscmd客户端

   在odps安装目录下,如下图:
DataWorks 重点难点
   第一种运行方式:双击运行.bat文件即可

建议:将此bat文件发送到桌面,这样以后直接运行桌面的快捷键即可。

,即可进入到指定的数仓project目录下。

建议:通过此方式进行执行脚本。

2.5 odpscmd 最佳实践

   下面主要介绍两种脚本,大家在使用的时候直接根据自己的目的性进行修改即可。
上传数据(Upload)

# 针对无分区表的上传情况:
tunnel upload D:\myfiles\temp\mytest.csv yht_dw_dev.t_mytable -ow true -charset gbk
# -ow 表示覆盖写入
# -charset 表示编码使用gbk方式,中文不会乱码

# 针对无分区表的上传情况:
tunnel upload D:\myfiles\temp\mytest.csv yht_dw_dev.t_mytable\pt="2022-07-06" -ow true -charset gbk

下载数据(Download)

# 对于无分区的表的数据的下载
tunnel download yht_dw_dev.t_billing_info -cf=true D:\myfiles\temp\hangzhou_billing_info.csv
# -cf 表示下载的文件格式为csv,如果不指定,默认为txt格式

# 对于有分区的表的数据的下载
# -- 将test_project.test_table表(二级分区表)中的数据下载到test_table.txt文件中。
tunnel download test_project.test_table/p1="b1",p2="b2" test_table.txt;

具体细节请参见阿里云官方文档 MaxCompute客户端安装(odpscmd)
具体细节请参见阿里云官方文档 Tunnel命令上传下载数据(odpscmd)

3 DataWorks调度配置解析

3.1 调度基本介绍

调度规则

首先满足依赖关系:即上游节点必须完成,才能调度下游节点;其次,判断定时时间是否已经到了,如果到了,立即执行;如果没有到,等待时间。

依赖关系

依赖关系是描述两个或多个节点之间的语义连接关系,其中上游节点的状态将影响其他下游节点的运行状态,反之,则不成立。

依赖关系细节
DataWorks 重点难点

当任务对之前的周期有依赖的时候,可以勾选依赖上一周期,然后根据自己的要求选择具体的依赖项。

跨周期和跨版本,版本可以理解为一个业务日期,如果今天的任务依赖昨天任务即跨版本,今天的多个周期之间互相依赖,即跨周期。需要注意的是跨周期依赖不能指定具体哪个周期,只能依赖上一个周期!

本节点:即为自依赖,等待上一周期运行成功后才可执行

一级子节点:依赖第一层子任务的上一个周期

其他节点:可以选择本project或者其他project的节点作为依赖,即等待自定义节点上一周期运行成功后,才可执行。

3.2 调度依赖关系

天-天任务依赖
DataWorks 重点难点

  • 天任务相互依赖,天定时任务相互依赖,上游未完成时下游即使到达定时时间,也不运行。

天-天任务依赖——上游天任务跨周期依赖DataWorks 重点难点

  • 上游任务自依赖,即存在跨周期依赖,上游前一天的周期任务失败,今天的任务A不会运行,今天下游任务B也会被堵塞。

天-天任务依赖——上游天任务依赖上一周期一层子节点
DataWorks 重点难点

  • 天任务相互依赖,上游任务依赖上一周期的一层子节点,上游昨天的任务未成功运行会堵塞昨天下游和今天的上游和下游任务的执行。

小时调度自依赖DataWorks 重点难点

  • 小时任务依赖上一周期,只要一个周期未成功,后续所有周期都会阻塞,并且可以有效避免一个周期任务运行慢了导致后续周期定时时间到了,任务并发运行。

小时依赖天调度

DataWorks 重点难点小时依赖天调度

  • 小时任务依赖天任务,待天任务完成后,开始调度小时任务,定时时间已到的周期会并发开始执行

天依赖小时调度

DataWorks 重点难点天依赖小时调度

  • 天任务依赖小时任务,需要等小时任务的所有周期完成后才能调度天任务,即使天任务定时时间已经到了,但是小时任务还有周期未完成就不会被调度。

小时任务依赖小时任务

DataWorks 重点难点小时任务依赖小时任务

  • 上游跟下游都是小时任务,且周期数相同,则每个运行周期一一对应,下游若晚于上游定时,定时时间到并不会调度,需要等上游对应周期运行完成才会开始调度。

小时任务依赖小时任务周期数不一样

DataWorks 重点难点小时依赖小时-周期不一致

  • 小时任务依赖小时任务,且下游周期数大于上游周期数,会依据就近原则挂依赖(时间小于等于自己且不重复依赖)

小时依赖天任务——下游不并发

DataWorks 重点难点小时依赖天-小时任务不并发

  • 如果上游任务完成时,下游有多个周期定时时间已到,会导致这些周期被并发调度起来。如果不希望下游并发调度起来,则需要将小时调度改成自依赖——本节点->依赖上一周期。但是这样会出现一个问题,就是自依赖会依赖跨版本,如果昨天最后一个周期未完成,会导致今天的任务无法调度。

**天依赖小时任务——天任务到定时时间运行

DataWorks 重点难点天依赖小时任务

  • 任务依赖小时任务,需要等小时任务所有周期都完成才能开始调度。如果需要天任务尽量按照定时时间开始调度,则可以配置上游小时任务自依赖,待上游小时任务定时时间最近(且小于)的周期完成后,下游天任务就会被调度。

小时任务依赖天任务

DataWorks 重点难点小时依赖天任务-天自依赖

  • 小时任务依赖天任务且天任务自依赖,则小时任务的所有周期也会依赖上一周期的天任务。

天依赖小时任务-小时依赖上一周期一级子节点
DataWorks 重点难点

  • 天依赖小时任务,小时任务依赖上一周期一级节点:上游的小时任务跨周期依赖下游的定时天任务,即上游小时任务会在每一周期都会依赖上一版本的下游任务。

小时任务依赖小时任务——下游节点依赖自定义父节点

DataWorks 重点难点小时依赖小时任务-下游节点依赖自定义节点

  • 下游节点设置依赖自定义节点(父节点ID) 此case比较特别,即可看出其实图中存在两个概念,既有跨周期(依赖上游小时任务的上一周期),又存在跨版本(依赖上游小时任务的上一版本的所有周期)