批處理作業(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.yaml
Loops工作流
以下示例表示:在鏡像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 container
DAG工作流(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集群概述。
創建工作流集群,具體操作,請參見創建工作流集群。
創建工作流,具體操作,請參見創建工作流。
在工作流集群中掛載存儲卷,具體操作,請參見使用存儲卷。