靈活運用DataWorks參數配置

數據工場DataWorks (原大數據開發套件Data IDE) 是基於MaxCompute作為計算和存儲引擎的,並用於工作流可視化開發和託管調度運維的海量數據離線分析平台。DataWorks可以按照時間和依賴關係,實現任務的全面託管和調度。在這裡,筆者跟大家探討一下眾多DataWorks用戶經常遇到的一類問題,就是在DataWorks中如何靈活運用參數配置這個功能。

很多用戶的需求場景是和時間有關的。為使周期運行的任務能根據運行時間的變化而變化,DataWorks提供了系統參數和自定義參數等兩種參數,供用戶來使用。下面來具體介紹下。

一、系統參數

DataWorks(數據工場)提供了 2 個系統參數,定義如下:

${bdp.system.cyctime}:定義為一個實例的定時運行時間,默認格式為: yyyymmddhh24miss。

${bdp.system.bizdate}:定義為一個實例運行時對應的業務日期,業務日期默認為運行日期的前一天,默認以 yyyymmdd 的格式顯示。

從定義可知,運行時間和業務日期有如下計算公式:運行時間=(業務日期+1)+定時時間。

若使用系統參數,可以直接在代碼中引用 ${bdp.system.bizdate}${bdp.system.cyctime} 即可,系統在調度運行時將自動把這兩個參數替換成相應的時間。

很多用戶的周期任務都是和日期/時間有關的,比如某用戶的一個周期任務,每天都要處理昨天產生的業務數據,用戶需要先按照昨天的日期創建一個分區,然後再把昨天的相關數據寫入到該分區下。這裡以每天周期運行,生成一個新的分區為例,為大家演示如何靈活利用好這兩個系統參數。

如上圖所示,首先新建一個分區表tbltest1,分區欄位有3個,分別是sale_biz_date ,sale_curtime 和 region,其中sale_biz_date代表業務日期,sale_curtime代表運行時間,region代表區域。

上圖中,sql任務的目的是,為表tbltest1增加一個分區,分區中使用了2個系統參數,每次運行該任務時,這兩個系統參數${bdp.system.bizdate}${bdp.system.cyctime}都會被分別替換成具體日期和時間。

如上圖所示,在這個sql周期任務的「調度配置」處,設置成小時周期任務,並且從0點開始,每小時執行一次,這樣1天理論上每個小時就會產生一個實例。

通過上圖的設置,每個小時都會運行一次這個sql任務。在DataWorks的「運維中心」——「任務運維」——「周期實例」下可以看到每個小時都會產生一個任務實例,如下圖所示。

點擊進到某個任務實例,比如0點這個實例,點擊工作流中對應的sql任務節點,點擊「運行日誌」,能看到在日誌中,sql語句alter table tbltest1 add partition(sale_biz_date=${bdp.system.bizdate},sale_curtime=${bdp.system.cyctime}, region=china);中的系統參數${bdp.system.bizdate}已經被替換成了20180304,而${bdp.system.cyctime}已經被替換成了20180305000000。這正是符合我們的預期的。

上圖是0點產生的實例,我們看下下面1點產生的實例進行驗證。

我們可以通過下圖看到,在凌晨1點時產生的實例,點擊工作流中對應的sql任務節點,點擊「運行日誌」,能看到在日誌中,sql語句alter table tbltest1 add partition(sale_biz_date=${bdp.system.bizdate},sale_curtime=${bdp.system.cyctime}, region=china);中的系統參數${bdp.system.bizdate}已經被替換成了20180304,而${bdp.system.cyctime}已經被替換成了20180305010000。同樣,這正是符合我們的預期的。

二、自定義參數

當使用自定義參數時:

非 Shell 類型的腳本或任務:需要先在代碼中編輯 ${key1},${key2},然後在 參數 編輯框輸入 「key1=value1 key2=value2」 方可生效。

Shell 類型的腳本或任務:需要先在代碼中編輯 $1 $2 $3,然後在 參數 編輯框 「value1 value2 value3」 方可生效。

我們這裡以非shell類型腳本為例,進行介紹。

很多客戶有特殊的需求,系統參數已經不能滿足其需求了。比如客戶當時運行的任務,想取當前時間中的年或月,或者想取前N天或後N天的時間。這時,自定義參數便能滿足客戶的需求。

這裡請注意,自定義參數是基於bdp.system.cyctime進行計算取值的,也就是基於運行時間進行取值的。例如「key1=$[yyyy]」表示按 bdp.system.cyctime 的值取年的部分作為結果替換該參數。

可供參考的自定義參數配置方式如下:

後N年:$[add_months(yyyymmdd,12*N)]前N年:$[add_months(yyyymmdd,-12*N)]後N月:$[add_months(yyyymmdd,N)]前N月:$[add_months(yyyymmdd,-N)]後N周:$[yyyymmdd+7*N]前N周:$[yyyymmdd-7*N]後N天:$[yyyymmdd+N]前N天:$[yyyymmdd-N]後N小時:$[hh24miss+N/24]前N小時:$[hh24miss-N/24]後N分鐘:$[hh24miss+N/24/60]前N分鐘:$[hh24miss-N/24/60]

通過上述自定義參數配置方式,我們可以發現一個規律,前四個自定義參數配置方式中,add_months裡面的數字的單位是月,所以後N年的配置中,N才會乘上12;其他的自定義參數配置中,中括弧中的數字的單位是天,所以後N周的配置中,N才會乘上7。

比如,有某用戶的需求是,其ODPS_SQL 任務為按小時調度,每隔 1 小時執行一次,代碼中有兩個自定義參數 thishour 和 lasthour,操作如下:

在DataWorks 「數據開發」中,sql代碼如下:

insert overwrite table tb1 partition(ds =20150304) selectc1,c2,c3from (select * from tb2where ds =${thishour}) tfull outer join(select * from tb3where ds = ${lasthour}) yon t.c1 = y.c1;

配置為每小時一次的調度,如下圖:

自定義參數配置為:thishour=$[yyyy-mm-dd/hh24:mi:ss]

即當前的運行時間;lasthour =$[yyyy-mm-dd/hh24:mi:ss-1/24],即當前運行時間的上一個小時的時間。

在周期性任務提交後的第二天,在運維中心可以看到系統自動按時間周期生成的運行實例。例如在 2017 年 07 月 16 日這一天,系統為該任務每小時生成一個實例。運行日期為 2017 年 07 月 16 日,因此 ${bdp.system.cyctime} 的日期部分應當是 20170716。

先看下20170716生成的第一個實例,即0點的實例,看下日誌中,如下圖:

第一個實例定時時間為 2017-07-16 00:00:00,那麼 thishour 替換的結果為 2017-07-16/00:00:00,lasthour 替換的結果為 2017-07-15/23:00:00。同理,第二個實例定時時間為 2017-07-16 01:00:00,那麼 thishour 替換的結果為 2017-07-16/01:00:00,lasthour 替換的結果為 2017-07-16/00:00:00。如下圖所示。

上面介紹了DataWorks參數調度中系統參數和自定義參數的使用方法,請大家注意到:運行時間=(業務日期+1)+定時時間,即運行時間和業務日期之間的關係。後續,筆者還會更新大家在使用參數調度中遇到的一些問題,敬請關注,謝謝。

了解更多請微博關注阿里雲客戶滿意中心

推薦閱讀:

什麼是雲支付?
估值75億,UCloud如何在巨頭林立的市場佔據一席之地?| 新龍榜
鄭葉來:為什麼華為雲的「三不」很重要
一個高速LVS-DR替代系統設計 -- 基於dpdk的高性能負載均衡器
阿里雲到底是個什麼東西,與亞馬遜的雲服務相比較,它處於什麼位置?

TAG:阿里雲 | 雲計算 | 雲服務 |