SAS 內建與搭配 ETL 工具的 3 種排程設定
Author:Omniwaresoft / Data and Analytics team / Kane Tu
前言
當我們透過 SAS Enterprise Guide (EG) 將預執行內容拖拉點選或是撰寫完 SAS Code 之後,可以使用排程功能,設定觸發時程及頻率,將程式安排進 Windows 工作排程器。然而隨著被安排進去到 Windows 工作排程器的程式逐漸增多,會發現有些需求無法被滿足,例如:
- 讓 A、B 程式都執行成功後緊接著執行 C 程式。
- 想知道 A、B、C 程式執行歷程記錄。
上述皆是 Windows 工作排程器無法滿足的需求,而 ETL 工具如 Informatica、Pentaho、Trinity 等便能夠實現上述需求來設定排程。
本文會介紹 SAS EG 的內建排程功能,再往下延伸 2 種結合 ETL 工具如 Trinity 來執行 SAS 軟體的 vbs 及 sas 2 種檔案的排程設定,最後透過 Trinity 環境將上文提到的兩種需求呈現出來。
第 1 種排程:SAS EG 排程功能
- 將預執行檔案先儲存成專案檔 (egp),並在專案窗格點選「 ⁝ 」 ,選取「排程專案」。
2. 於「觸發程式」頁籤中設定執行頻率與執行時間。
3. 按「確定」,該專案便已排入 Windows 工作排程器。
4. 當成功排入 Windows 工作排程器,SAS EG 會產出 1 個 VBScript 指令檔 (vbs),此 vbs 檔會在後續的第 2 種排程繼續使用到。
第 2 種排程:SAS 搭配 Trinity 排程設定 – 執行 vbs 檔
- 環境說明:Trinity Server 在主機 1、SAS OA Server 在主機 2。
- 透過主機 1 的 Trinity,執行主機 1 的 Powershell,連線進入到主機 2,使用主機 2 的命令提示字元(Command Line)執行 SAS 軟體的 vbs 檔。
- Trinity Job Step 內嵌 Powershell 語法如下:
$username = '${USERNAME}'
$password = '${PASSWORD}'
$pass = ConvertTo-SecureString -AsPlainText $password -Force
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList $username,$pass
Invoke-Command -ComputerName '${COMPUTERNAME}' -Credential $cred -ErrorAction Stop -ScriptBlock {Invoke-Expression -Command: 'cmd.exe /c CScript "E:\DataMart\Digital Mart\EGScript11.vbs"' }
第 3 種排程:SAS 搭配 Trinity 排程設定 – 執行 sas 檔
- 環境說明:Trinity Server 在主機 1、SAS OA Server 在主機 2。
- 透過主機 1 的 Trinity,執行主機 1 的 Powershell,連線進入到主機 2,使用主機 2 的命令提示字元(Command Line)執行 SAS 軟體的 sas 檔。
- Trinity Job Step 內嵌 Powershell 語法如下:
$username = '${USERNAME}'<br>$password = '${PASSWORD}'
$pass = ConvertTo-SecureString -AsPlainText $password -Force
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList $username,$pass
Invoke-Command -ComputerName '${COMPUTERNAME}' -Credential $cred -ErrorAction Stop -ScriptBlock {Invoke-Expression -Command: 'cmd.exe /c ${SAS_HOME} -CONFIG ${SAS_UTF8} -SYSIN E:\TrinityProcess${DATAMARTNAME}${TABLENAME}.sas -ICON -NOSPLASH -LOG E:\TrinityProcess${DATAMARTNAME}\Log${TABLENAME}_%date:~0,4%-%date:~5,2%-%date:~8,2%.log'}
Trinity 環境呈現
- 有 5 個程式檔,各別為 DM_DIG_D10、DM_DIG_D11、DM_DIG_D12、DM_DIG_D13 和 DM_DIG_FINISH_STATUS,其中 DM_DIG_D10 ~ D13 是 vbs 檔,而 DM_DIG_FINISH_STATUS 是 sas 檔。
- 執行狀況為每天 8 點同時執行 DM_DIG_D10、DM_DIG_D11、DM_DIG_D12 和 DM_DIG_D13 的 4 支 vbs 檔,等全部檔案都執行完成且成功後,再執行 DM_DIG_FINISH_STATUS 這支 sas 檔。
- 因每支排程執行時間不一,執行最久的排程是 DM_DIG_D10,平均 5 ~ 7 分鐘,所以在 Windows 工作排程器上面,預計會設定 DM_DIG_FINISH_STATUS 這支排程在 8 點 10 分再執行,如下圖所示:
若是將上述的排程列表使用 Trinity ETL 工具進行設定,便會如下圖所示:
上圖清楚呈現排程上下游之間的關係,並且透過 Trinity 的設定,只要 DM_DIG_D10 ~ D13 4 支 Job 都執行成功後,就能立刻接續執行 DM_DIG_FINISH_STATUS 這支 Job,不需要中間的等待時間,所以可以節省約 3 ~ 5 分鐘的時間。
並且 Trinity 能夠查出每個 Job 的執行歷程,如執行狀況是成功或失敗、開始執行時間、結束時間、執行時間長度等紀錄,如下圖所示:
結論
透過上述的例子,隨著被排進到 Windows 工作排程器的數量越來越多,且程式之間有優先順序或是依照程式執行成功或失敗的結果來觸發不同程式執行時,便需要搭配 ETL 工具來符合上述需求。