MaxCompute周期調度任務(Periodic Task)功能,支援通過SQL語句自訂調度和計算邏輯,從而高效靈活地管理定時調度任務,實現更短的周期、高效的運行及低成本的調度管理。
功能介紹
MaxCompute周期調度任務(Periodic Task)可以靈活自訂任務調度策略,執行對應的SQL計算邏輯,自動構建資料管道,簡化ETL鏈路。此外,您還可以將任務與表資料變更和流讀情境相結合,從而實現連續的ETL工作流程,以處理最近更改的資料。該功能具有以下特性:
支援SQL語言:所有針對定時任務的管理操作均可通過簡潔的SQL語言實現。
支援全生命週期管理:包括建立、修改、刪除、查看以及查看工作清單和任務執行執行個體列表。
秒層級周期調度任務:支援最短10秒的定時調度。
MaxCompute內建調度服務,更高效成本更低。
支援配置執行個體啟動條件的When運算式,可實現較為複雜的條件判斷。
支援與平台內對象的無縫結合。例如:支援Delta Table CDC、Object Table等需要定期重新整理的對象,提供高效的內建調度服務。
預設支援增量CDC資料後台自動產生。
該功能目前處於邀測中,邀測功能使用方法請參見使用說明。
注意事項
建立或刪除周期調度任務前,您需要在Session層級設定SET odps.sql.periodic.task.enabled=true;參數,開啟Task自動執行累加式更新開關。否則無法建立或刪除周期調度任務。
建立周期調度任務(Periodic Task)
文法
CREATE TASK [IF NOT EXISTS] <task_name>
SCHEDULE = "<num> [minute|minutes] | [second|seconds]"
[TASKPROPERTIES("schedule_strategy"="3",--指定定時調度任務重試次數
"odps.namespace.schema"="true" ....];
[COMMENT task_comment]
[WHEN <bool_expr>]
AS <taskBody>;參數說明
配置項 | 是否必填 | 描述 |
IF NOT EXISTS | 否 | 建立任務時:
|
task_name | 是 | 周期調度任務名稱。 |
SCHEDULE = "<num> [minute|minutes] | [second|seconds]" | 是 | 執行循環時間長度。支援的單位為分鐘、秒,取值範圍為[10秒, 59*60秒]。 說明 單位為秒的數值限制為10~59,大於60秒時,需要將單位設定為分鐘。 |
| 否 | 定時任務調度執行SQL時需要指定的參數,均可通過此處配置。常見取值為
|
| 否 | 周期調度任務的注釋內容。注釋內容為長度不超過1024位元組的有效字串,否則報錯。 |
WHEN | 否 | 支援配置一個BOOLEAN運算式。僅當該運算式返回TRUE時,後續SQL的執行才會被觸發。如果未進行配置,則預設為TRUE。目前對支援的條件陳述式進行了相應的約束,只有部分函數支援使用。 說明
|
| 是 | 要執行的SQL任務。SQL語句不支援指令碼模式執行的語句,目前支援常用的DML和DQL文法,不支援DDL。 |
樣本
建立調度任務periodic_task1,每5分鐘(minutes)調度一次,調度失敗會重試3次。僅當判斷條件stream_has_data('delta_table_stream')返回結果為TRUE時,執行SQL任務INSERT INTO acid2_table_dest SELECT pk, val FROM acid_stream。
建立一個Delta Table增量表。
CREATE TABLE acid2_table_dest ( pk BIGINT NOT NULL PRIMARY KEY, val BIGINT ) tblproperties ("transactional"="true");建立Delta Table源表,再建立一個Stream關聯Delta Table表。
-- 建立Delta Table源表 CREATE TABLE delta_table_src ( pk bigint NOT NULL PRIMARY KEY, val bigint ) tblproperties ("transactional"="true"); -- 建立一個Stream關聯Delta Table表 CREATE STREAM delta_table_stream ON TABLE delta_table_src version as of 1 strmproperties('read_mode'='append') comment 'stream demo';建立一個定時調度任務periodic_task1。
--開啟Task自動執行累加式更新 SET odps.sql.periodic.task.enabled=true; CREATE TASK IF NOT EXISTS periodic_task1 schedule = '5 minutes' TASKPROPERTIES('schedule_strategy'='3') comment 'task_comment' WHEN stream_has_data('delta_table_stream') AS INSERT INTO acid2_table_dest SELECT pk, val FROM delta_table_stream;說明其中
stream_has_data('delta_table_stream')的條件判斷,等同於在MaxCompute中執行SELECT stream_has_data('delta_table_stream');命令。插入資料至Delta Table源表,並等待調度結束,查看目標表資料。
-- 插入資料至Delta Table源表 INSERT INTO delta_table_src VALUES (1, 1), (2, 2); -- 等待調度結束, 查看目標表資料 SELECT * FROM acid2_table_dest;返回結果如下:資料已成功寫入acid2_table_dest表。
--查到兩條結果 +------------+------------+ | pk | val | +------------+------------+ | 1 | 1 | | 2 | 2 | +------------+------------+
修改定時調度任務(Periodic Task)
文法
修改定時調度任務的調度時間(執行循環時間長度)、SQL參數(例如任務重試次數等)及注釋內容
ALTER TASK [IF EXISTS] <task_name> SET SCHEDULE = "<num> [minute|minutes] | [second|seconds]" [TASKPROPERTIES("schedule_strategy"="3",--指定定時調度任務重試次數 "odps.namespace.schema"="true" ....]; [COMMENT task_comment];重啟(resume) 或暫停(suspend)周期調度任務
說明建立定時調度任務後會自動啟動,若定時調度任務出現問題或手動執行了暫停(suspend)操作,導致任務暫停,您可以通過重啟(resume)操作,重新啟動定時調度任務。重啟後通過
DESC查看定時調度任務的狀態是ACTIVE。ALTER TASK [IF EXISTS] task_name resume | suspend;修改周期調度任務的觸發條件判斷
WHEN運算式,建立Task後可通過該文法修改WHEN運算式ALTER TASK [IF EXISTS] task_name MODIFY WHEN <boolean_expr>;
參數說明
配置項 | 是否必選 | 描述 |
IF EXISTS | 否 | 修改定時調度任務時:
|
boolean_expr | 是 | 周期調度任務的觸發條件判斷 |
其他更多相關參數說明,請參見參數說明。
樣本
樣本1:重啟周期調度任務
ALTER TASK periodic_task1 resume;樣本2:暫停周期調度任務
ALTER TASK periodic_task1 suspend;樣本3:修改調度時間周期為6分鐘
ALTER TASK IF EXISTS periodic_task1 SET schedule = '6 minute';樣本4:添加註釋內容
ALTER TASK IF EXISTS periodic_task1 SET comment 'comment2';樣本5:指定周期調度任務重試次數為5次
ALTER TASK IF EXISTS periodic_task1 SET taskproperties('schedule_strategy'='5');樣本6:修改任務觸發條件判斷
WHEN運算式ALTER TASK IF EXISTS periodic_task1 MODIFY WHEN 1=1;
查看定時調度任務(Periodic Task)資訊
文法
查看定時調度任務資訊
DESC task <task_name>;查看定時調度任務資訊以及Extended資訊
DESC extended task <task_name>;
參數說明
task_name:周期調度任務名稱。
樣本
查看定時調度任務periodic_task1資訊。
DESC task periodic_task1;返回結果樣本如下:
+------------------------------------------------------------------------------------+
| Owner: ALIYUN$odps****@aliyun.com |
| Project: sql_odps2 |
| Schema: |
| Task: periodic_task1 |
+------------------------------------------------------------------------------------+
| CreateTime: 2024-08-23 11:05:46 |
| LastModifiedTime: 2024-08-23 11:05:46 |
+------------------------------------------------------------------------------------+
| ScheduleText: '5 minute' |
| TaskType: SQL |
| Query: insert into acid2_table_dest select pk, val from acid_stream; |
| Condition: stream_has_data('acid_stream') |
| Status: ACTIVE |
| Comment: |
+------------------------------------------------------------------------------------+刪除定時調度任務(Periodic Task)
文法
DROP TASK [IF EXISTS] <task_name>; 參數說明
配置項 | 是否必填 | 描述 |
IF EXISTS | 否 | 刪除定時調度任務時:
|
task_name | 是 | 需要刪除的定時調度任務(Periodic Task)名稱。 |
樣本
刪除periodic_task1任務,命令如下:
DROP TASK periodic_task1;查看所有定時調度任務(Periodic Task)列表
您可以通過以下SQL,查看當前MaxCompute專案下的所有定時調度(Periodic Task)任務。
文法
SHOW TASKS; 樣本
查看已建立的定時調度任務。
SHOW TASKS; 返回結果樣本如下:
+--------------------------------------------------------------------------------------------------------------------------------+
| Project: openmronlot_daily_arm_src3_xr |
| Schema: |
+--------------------------------------------------------------------------------------------------------------------------------+
| Tasks: |
+--------------------------------------------------------------------------------------------------------------------------------+
| Name | Owner | CreateTime | LastModifiedTime | Status |
+--------------------------------------------------------------------------------------------------------------------------------+
| periodic_task1 | ALIYUN$odpst****@aliyun.com | 2024-07-26 16:19:06 | 2024-07-26 16:19:06 | ACTIVE |
| periodic_task2 | ALIYUN$odpst****@aliyun.com | 2024-07-26 16:19:28 | 2024-07-26 16:19:28 | ACTIVE |
| periodic_task3 | ALIYUN$odpst****@aliyun.com | 2024-07-26 16:20:45 | 2024-07-26 16:20:45 | ACTIVE |
| periodic_task6 | ALIYUN$odpst****@aliyun.com | 2024-08-15 11:09:55 | 2024-08-15 11:09:55 | ACTIVE |
| periodic_task_alter1 | ALIYUN$odpst****@aliyun.com | 2024-07-26 16:17:40 | 2024-07-26 16:17:40 | ACTIVE |
+--------------------------------------------------------------------------------------------------------------------------------+查看定時調度任務(Periodic Task)自動調度執行個體的歷史列表
您可查看定時調度任務(Periodic Task)自動調度執行個體的InstanceId、CreateTime、EndTime以及Status資訊。
若需要查看某個自動調度執行個體的詳細日誌,可以執行WAIT <InstanceId>;命令。例如:執行WAIT 2024082309000177gq71ut9****;命令可擷取到MaxCompute Logview地址。您可以將Logview地址複製到瀏覽器中,查看其詳細日誌。
文法
SHOW HISTORY FOR TASK <task_name> [[LIMIT <limit_value>] OFFSET <offset_value>]; 參數說明
參數 | 是否必填 | 說明 |
task_name | 是 | 周期調度任務名稱。 |
limit_value | 否 | 用於顯示的記錄條數,例如
|
offset_value | 否 | 用於指定起始位置,代表跳過指定數量的記錄。當取值為0時,即表示起始位置為最新一條任務記錄。 |
樣本
樣本1:查看定時調度任務periodic_task1的自動調度歷史列表資訊。命令如下:
SHOW HISTORY FOR TASK periodic_task1;返回結果如下:
+---------------------------------------------------------------------------------------------------+ | Project: muze_demo | | Schema: | | Task: periodic_task1 | +---------------------------------------------------------------------------------------------------+ | History: | +---------------------------------------------------------------------------------------------------+ | InstanceId | CreateTime | EndTime | Status | +---------------------------------------------------------------------------------------------------+ | 202506130710002599mhgq4**** | 2025-06-13 15:10:00 | 2025-06-13 15:10:00 | Terminated | | 2025061307050039g47jzzs1**** | 2025-06-13 15:05:00 | 2025-06-13 15:05:00 | Terminated | | 2025061307000030o9vh1l1**** | 2025-06-13 15:00:00 | 2025-06-13 15:00:00 | Terminated | | 2025061306550032l84ahcr4**** | 2025-06-13 14:55:00 | 2025-06-13 14:55:00 | Terminated | | 2025061306500043cthoc62**** | 2025-06-13 14:50:00 | 2025-06-13 14:50:00 | Terminated | | 20250613064500324fkhaz1**** | 2025-06-13 14:45:00 | 2025-06-13 14:45:00 | Terminated | | 2025061306400048194cx8g**** | 2025-06-13 14:40:00 | 2025-06-13 14:40:00 | Terminated | | 20250613063500351g99kf2**** | 2025-06-13 14:35:00 | 2025-06-13 14:35:00 | Terminated | | 2025061306300084qkbtk9**** | 2025-06-13 14:30:00 | 2025-06-13 14:30:00 | Terminated | | 20250613062501711nswoio**** | 2025-06-13 14:25:01 | 2025-06-13 14:25:01 | Terminated | | 2025061306200129vln5ncr4**** | 2025-06-13 14:20:01 | 2025-06-13 14:20:01 | Terminated | | 2025061306150119yhlkmbo**** | 2025-06-13 14:15:00 | 2025-06-13 14:15:01 | Terminated | | 2025061306100139uemvy7r6**** | 2025-06-13 14:10:00 | 2025-06-13 14:10:01 | Terminated | +---------------------------------------------------------------------------------------------------+樣本2:查看定時調度任務periodic_task1的自動調度歷史列表資訊,指定起始位置為最新一條的記錄,顯示記錄條數為6。
SHOW HISTORY FOR TASK periodic_task1 LIMIT 6 OFFSET 0;返回結果如下:
+---------------------------------------------------------------------------------------------------+ | Project: muze_demo | | Schema: | | Task: periodic_task1 | +---------------------------------------------------------------------------------------------------+ | History: | +---------------------------------------------------------------------------------------------------+ | InstanceId | CreateTime | EndTime | Status | +---------------------------------------------------------------------------------------------------+ | 202506130710002599mhgq4**** | 2025-06-13 15:10:00 | 2025-06-13 15:10:00 | Terminated | | 2025061307050039g47jzzs1**** | 2025-06-13 15:05:00 | 2025-06-13 15:05:00 | Terminated | | 2025061307000030o9vh1l1**** | 2025-06-13 15:00:00 | 2025-06-13 15:00:00 | Terminated | | 2025061306550032l84ahcr4**** | 2025-06-13 14:55:00 | 2025-06-13 14:55:00 | Terminated | | 2025061306500043ethoc62**** | 2025-06-13 14:50:00 | 2025-06-13 14:50:00 | Terminated | | 20250613064500324fkhaz1**** | 2025-06-13 14:45:00 | 2025-06-13 14:45:00 | Terminated | +---------------------------------------------------------------------------------------------------+樣本3:查看定時調度任務periodic_task1的自動調度歷史列表資訊,跳過5條記錄,即指定起始位置為第6條記錄。
SHOW HISTORY FOR TASK periodic_task1 OFFSET 5;返回結果如下:
+---------------------------------------------------------------------------------------------------+ | Project: muze_demo | | Schema: | | Task: periodic_task1 | +---------------------------------------------------------------------------------------------------+ | History: | +---------------------------------------------------------------------------------------------------+ | InstanceId | CreateTime | EndTime | Status | +---------------------------------------------------------------------------------------------------+ | 20250613064500324fkhaz1**** | 2025-06-13 14:45:00 | 2025-06-13 14:45:00 | Terminated | | 2025061306400048194cx8g**** | 2025-06-13 14:40:00 | 2025-06-13 14:40:00 | Terminated | | 20250613063500351g99kf2**** | 2025-06-13 14:35:00 | 2025-06-13 14:35:00 | Terminated | | 2025061306300084qkbtk9**** | 2025-06-13 14:30:00 | 2025-06-13 14:30:00 | Terminated | | 20250613062501711nswoio**** | 2025-06-13 14:25:01 | 2025-06-13 14:25:01 | Terminated | | 2025061306200129vln5ncr4**** | 2025-06-13 14:20:01 | 2025-06-13 14:20:01 | Terminated | | 2025061306150119yhlkmbo**** | 2025-06-13 14:15:00 | 2025-06-13 14:15:01 | Terminated | | 2025061306100139uemvy7r6**** | 2025-06-13 14:10:00 | 2025-06-13 14:10:01 | Terminated | +---------------------------------------------------------------------------------------------------+
函數白名單
建立周期調度任務(Periodic Task)時,支援配置一個BOOLEAN運算式。目前,對支援的條件陳述式進行了相應的約束,僅支援使用以下。函數詳情,請參見內建函數(字母排序)。
DATEADD
DATEDIFF
DATEPART
DATETRUNC
DATE_FORMAT
FROM_UNIXTIME
GETDATE
ISDATE
LASTDAY
LAST_DAY
UNIX_TIMESTAMP
WEEKDAY
WEEKDAY
WEEKOFYEAR
TO_DATE
TO_CHAR
YEAR
QUARTER
MONTH
DAY
DAYOFMONTH
HOUR
MINUTE
SECOND
CURRENT_TIMESTAMP
FROM_UTC_TIMESTAMP
ADD_MONTHS
NEXT_DAY
MONTHS_BETWEEN
TO_MILLIS
ABS
ROUND
CONCAT
CONCAT_WS
GET_JSON_OBJECT
INSTR
LENGTH
LENGTHB
REGEXP_EXTRACT
REGEXP_REPLACE
REGEXP_INSTR
REGEXP_SUBSTR
REGEXP_COUNT
REVERSE
SUBSTR
TOLOWER
TOUPPER
TRIM
LTRIM
RTRIM
REPLACE
SIZE
FIELD
COALESCE
IF
SPLIT
SPLIT_PART
FROM_JSON
MAX_PT
TABLE_EXISTS
PARTITION_EXISTS
GET_LATEST_VERSION
GET_LATEST_TIMESTAMP