批次工作(Batch)通常用於資料處理、模擬計算、科學計算等領域,往往需要大規模的計算資源。分布式工作流程Argo叢集基於開源Argo Workflows專案開發,完全符合開源工作流程標準。通過工作流程叢集,您可以輕鬆編排工作流程,每個工作流程步驟使用容器運行,可以在短時間內輕鬆運行大規模機器學習、模擬計算和資料處理等計算密集型作業,也可以快速運行CI/CD流水線任務。將離線任務和批次運算任務遷移到工作流程叢集可以協助您降低營運複雜度、節約運行成本。
背景資訊
工作流程叢集是無伺服器Serverless工作流程引擎,基於Kubernetes叢集構建,託管了開源Argo Workflows。
Batch批次運算相關概念
作業(Jobs)
一個任務單元(例如Shell指令碼、Linux可執行檔或Docker容器鏡像),可以提交給Batch批次運算系統,批次運算系統會在計算環境中分配計算資源並運行作業。
Array Jobs
Array Job是指一系列相似或相同的作業,這些作業作為一個數組批量提交並運行。同一Array Job下的作業都有相同的工作定義,但可以通過索引來區分,每個工作執行個體會處理不同的資料集或執行稍有差異的任務。
工作定義(Job Definitions)
工作定義指定了作業的運行方式,運行作業前需要先建立工作定義。
工作定義一般包含:作業運行所使用的鏡像、具體命令與參數、需要的CPU/Memory資源、環境變數、磁碟儲存等。
作業隊列(Job Queues)
向Batch批次運算系統提交作業時,會提交到指定的作業隊列中排隊,直到作業被調度運行。作業隊列可以設定優先權,並指定關聯的計算環境。
計算環境(Compute Environment)
計算環境是一組計算資源,可以運行作業。計算環境需要指定虛擬機器的機型、環境的最小和最大vCPU數量、以及Spot競價執行個體的價格。
分布式工作流程Argo相關概念
模板(Templates)
模板定義了一個任務(作業),是工作流程的組成部分,一個工作流程至少要包含一個模板。模板中包含要啟動並執行Kubernetes容器和相應的輸入輸出參數。
工作流程(Workflows)
工作流程包含一個或者多個任務(模板),並可以編排多個任務,支援定義複雜的任務流程,如序列化、並行化任務,以及在條件滿足時執行特定的任務。建立工作流程後,工作流程中的任務會在Kubernetes叢集中以Pod形式運行。
工作流程範本(Workflow Templates)
工作流程範本是可複用的工作流程的靜態定義,類似於函數,可以在多個工作流程中被引用並運行。在定義複雜工作流程時可以複用已有的工作流程範本,減少重複性定義。
Serverless Kubernetes叢集
分布式工作流程Argo叢集內建計算環境,不需要手動建立和管理。工作流程提交後,使用阿里雲彈性容器ECI,以Serverless方式運行工作流程中的任務,不需要維護Kubernetes節點。利用阿里雲的彈效能力,可以運行大規模工作流程(數萬任務Pod),同時使用數十萬核CPU的算力資源,在工作流程運行完成後自動釋放資源。加快工作流程運行速度,並節省計算成本。
Batch批次運算和Argo工作流程對比
Batch批次運算
使用者需要學習Batch批次運算工作定義規範與用法,有廠商綁定風險。
還需要管理計算環境,設定機型和規模等,非Serverless方式,營運成本比較高。
由於計算環境規模的限制,需要管理作業隊列以設定作業的優先順序,複雜度比較高。
Argo工作流程
基於Kubernetes叢集和開源Argo Workflows構建,以雲原生的方式編排運行工作流程,無廠商綁定風險。
支援複雜工作流程工作的編排,可以應對資料處理、模擬計算、科學計算等複雜業務情境。
計算環境採用阿里雲彈性容器ECI,無需維護節點。
大規模算力的按需使用,隨用隨付,避免工作流程排隊等待,提高效率,節省計算成本。
功能映射
功能分類 | Batch批次運算 | Argo Workflows |
使用者體驗 | 批次運算CLI | |
Json定義作業 | YMAL定義作業 | |
SDK | ||
核心能力 | 作業(Jobs) | |
Array jobs | ||
Job dependencies | ||
Job Environments Variables | ||
Automated Job retries | ||
Job timeouts | ||
無 | ||
無 | ||
無 | ||
無 | ||
GPU jobs | ||
Volumes | ||
Job priority | ||
工作定義(JobDefinition) | ||
計算環境 | Job queues | 無,雲上Serverless彈性,作業無需排隊。 |
計算環境(Compute Environment) | ||
生態整合 | 事件驅動 | |
可觀測性 |
Argo工作流程樣本
簡單工作流程
以下樣本表示:啟動了一個任務Pod,使用alpine鏡像,運行Shell命令echo helloworld。
在此工作流程基礎上,可以在args中指定多個Shell命令並執行,也可以使用自訂鏡像運行鏡像中的命令。
cat > helloworld.yaml << EOF
apiVersion: argoproj.io/v1alpha1
kind: Workflow # new type of k8s spec
metadata:
generateName: hello-world- # name of the workflow spec
spec:
entrypoint: main # invoke the main template
templates:
- name: main # name of the template
container:
image: registry.cn-hangzhou.aliyuncs.com/acs/alpine:3.18-update
command: [ "sh", "-c" ]
args: [ "echo helloworld" ]
EOF
argo submit helloworld.yamlLoops工作流程
以下樣本表示:在鏡像print-pet中打包了pets.input文字檔和print-pet.sh指令檔,print-pet.sh以job-index為輸入參數,列印pets.input檔案行號為job-index的pet。具體檔案內容請訪問GitHub倉庫。
在工作流程中,會同時啟動5個Pod,並分別傳入參數job-index 1到job-index 5,每個Pod根據輸入的job-index的值,列印相應行的pet。
通過Loops工作流程可以實現資料分區和平行處理,加快海量資料的處理速度。更多Loops樣本,請參見工作流程(Workflows)Loops。
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: loops-
spec:
entrypoint: loop-example
templates:
- name: loop-example
steps:
- - name: print-pet
template: print-pet
arguments:
parameters:
- name: job-index
value: "{{item}}"
withSequence: # loop to run print-pet template with parameter job-index 1 ~ 5 respectively.
start: "1"
end: "5"
- name: print-pet
inputs:
parameters:
- name: job-index
container:
image: acr-multiple-clusters-registry.cn-hangzhou.cr.aliyuncs.com/ack-multiple-clusters/print-pet
command: [/tmp/print-pet.sh]
args: ["{{inputs.parameters.job-index}}"] # input parameter job-index as args of containerDAG工作流程(MapReduce)
真實的批處理情境中,往往需要多個Job配合完成,所以需要指定Job間的依賴關係,DAG是指定依賴關係的最佳方式。
但主流的Batch批處理系統,需要通過Job ID指定Job依賴,由於Job ID需要在Job提交後才能擷取,因此需要編寫指令碼實現Job間依賴(虛擬碼如下),Job較多時,依賴關係不夠直觀,維護成本較高。
//Batch批處理系統Job間依賴,JobB依賴JobA,在JobA完成後運行。
batch submit JobA | get job-id
batch submit JobB --dependency job-id (JobA)Argo工作流程可以通過DAG定義子任務之間的依賴關係,樣本如下:
Task B和Task C依賴Task A運行
Task D依賴Task B和Task C運行
# The following workflow executes a diamond workflow
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: dag-diamond-
spec:
entrypoint: diamond
templates:
- name: diamond
dag:
tasks:
- name: A
template: echo
arguments:
parameters: [{name: message, value: A}]
- name: B
depends: "A"
template: echo
arguments:
parameters: [{name: message, value: B}]
- name: C
depends: "A"
template: echo
arguments:
parameters: [{name: message, value: C}]
- name: D
depends: "B && C"
template: echo
arguments:
parameters: [{name: message, value: D}]
- name: echo
inputs:
parameters:
- name: message
container:
image: alpine:3.7
command: [echo, "{{inputs.parameters.message}}"]在Git倉庫中,還為您提供了一個MapReduce工作流程樣本,支援對資料進行分區處理,並對計算結果進行彙總。具體樣本,請參見map-reduce。
遷移Batch批處理系統到Argo工作流程
評估與規劃
評估現有Batch批次工作,包括依賴關係、資源需求、參數配置等。瞭解Argo Workflows的特性和最佳實務,並根據本文選擇Argo Workflows的功能以替代Batch批次工作。另外,由於分布式工作流程Argo叢集的Serverless ECI能力,您可以跳過規劃Compute Environment和管理優先順序隊列。
建立分布式工作流程Argo叢集
具體操作,請參見工作流程叢集快速入門。
轉換工作定義
根據Batch批次運算到Argo工作流程的功能映射,重寫Batch批次運算作業為Argo工作流程,也可以通過調用Argo工作流程SDK,以自動化方式建立工作流程,並接入業務系統。
資料存放區
確保分布式工作流程Argo叢集可以訪問工作流程運行所需要的資料,工作流程叢集可以掛載訪問阿里雲OSS、NAS、CPFS、雲端硬碟等儲存資源。更多資訊,請參見使用儲存卷。
測實驗證
驗證工作流程運行正常、資料訪問、結果輸出正常、資源用量符合預期。
營運:監控和日誌
開啟分布式工作流程Argo叢集可觀測能力,查看工作流程運行狀態和日誌。
使用建議
在使用者體驗、核心能力、計算環境和生態整合方面,Argo工作流程可以覆蓋主流Batch批處理系統的功能,同時在複雜工作流程編排和計算環境管理方面更具優勢。
工作流程叢集基於Kubernetes構建,工作流程定義符合Kubernetes YAML規範,子任務定義符合Kubernetes Container規範。如果您已經在使用Kubernetes運行線上應用,可以快速上手編排工作流程叢集,統一使用Kubernetes作為線上應用和離線應用的技術底座。
工作流程叢集計算環境採用阿里雲彈性容器ECI,不需要維護節點,同時提供大規模算力的按需使用,隨用隨付,避免工作流程排隊等待,提高運行效率,節省計算成本。
結合使用阿里雲Spot執行個體,可以大幅降低計算成本。
分布式工作流程適合CI/CD、資料處理、模擬計算、科學計算等業務情境。
相關參考
瞭解更多開源Argo工作流程內容,請參見開源Argo Workflows。
瞭解工作流程叢集的功能原理及相關操作,請參見分布式工作流程Argo叢集概述。
建立工作流程叢集,具體操作,請參見建立工作流程叢集。
建立工作流程,具體操作,請參見建立工作流程。
在工作流程叢集中掛載儲存卷,具體操作,請參見使用儲存卷。