作者:莊宇
在現代的軟件開發(fā)和數據處理領域,批處理作業(yè)(Batch)扮演著重要的角色。它們通常用于數據處理,仿真計算,科學計算等領域,往往需要大規(guī)模的計算資源。隨著云計算的興起,阿里云批量計算和 AWS Batch 等云服務提供了管理和運行這些批處理作業(yè)的平臺。
隨著云原生和 Kubernetes 生態(tài)的發(fā)展,越來越多的應用運行在 Kubernetes 之上,例如在線應用,中間件,數據庫。那對離線任務和批量計算是否可以在 Kubernetes 這個統(tǒng)一平臺之上運行,答案是肯定的,分布式工作流 Argo 集群 [ 1] ,基于開源?Argo Workflows [ 2] 項目,完全符合開源工作流標準,可以編排和運行離線任務和批量計算,并使用 Serverless 方式運行,降低運維復雜度,節(jié)省運行成本。
通過分布式工作流 Argo 集群,您可以輕松編排工作流,每個工作流步驟使用容器運行,可以在短時間內輕松運行大規(guī)模機器學習、仿真計算和數據處理等計算密集型作業(yè),也可以快速運行 CI/CD 流水線。
本文介紹主流 Batch 批量計算系統(tǒng)和分布式工作流 Argo 集群的區(qū)別,并討論如何將離線任務和批量計算遷移到分布式工作流 Argo 集群。
Batch?批量計算的相關概念
作業(yè)(Jobs)
一個任務單元(例如 shell 腳本、Linux 可執(zhí)行文件或 Docker 容器鏡像),可以提交給 Batch 批量計算系統(tǒng),批量計算系統(tǒng)會在計算環(huán)境中分配計算資源并運行作業(yè)。
Array Jobs
Array Job 是指一系列相似或相同的作業(yè)(Jobs),這些作業(yè)作為一個數組批量提交并運行。每一個作業(yè)都有相同的作業(yè)定義,但可以通過索引來區(qū)分,每個作業(yè)實例處理不同的數據集或執(zhí)行稍有差異的任務。
作業(yè)定義(Job Definitions)
作業(yè)定義指定了作業(yè)的運行方式。運行作業(yè)前需要先創(chuàng)建作業(yè)定義。作業(yè)定義一般包含:作業(yè)運行所使用的鏡像,具體命令與參數,需要的 CPU/Memory 資源,環(huán)境變量,磁盤存儲等。
作業(yè)隊列(Job Queues)
向 Batch 批量計算系統(tǒng)提交作業(yè)時,會提交到指定的作業(yè)隊列中排隊,直到被調度運行。作業(yè)隊列可以設置優(yōu)先級,并指定關聯(lián)的計算環(huán)境。
計算環(huán)境(Compute Environment)
計算環(huán)境是一組計算資源,可以運行作業(yè)。對計算環(huán)境需要指定虛擬機的機型,環(huán)境的最小、最大 vCPU 數量,以及 Spot 競價實例的價格。
總結
-
用戶需要學習 Batch 批量計算作業(yè)定義規(guī)范與用法,有廠商綁定風險;
-
還需要管理計算環(huán)境,設置機型和規(guī)模等,非 Serverless 方式,運維高;
-
由于計算環(huán)境規(guī)模的限制,需要管理作業(yè)隊列以設置作業(yè)的優(yōu)先級,復雜度高。
分布式工作流 Argo 集群的相關概念
模版(Templates)
模版定義了一個任務(作業(yè)),是工作流的組成部分,一個工作流至少要包含一個模版。模版中包含要運行的 Kubernetes 容器和相應的輸入輸出參數。
工作流(Workflows)
工作流包含一個或者多個任務(模版),并可以編排多個任務,支持定義復雜的任務流程,如序列化、并行化任務,以及在條件滿足時執(zhí)行特定的任務。創(chuàng)建工作流后,工作流中的任務,會在 Kubernetes 集群中以 Pod 形式運行。
工作流模版(Workflow Templates)
工作流模版是可復用的工作流的靜態(tài)定義,類似于函數,可以在多個工作流中被引用并運行。在定義復雜工作流時可以復用已有的工作流模版,減少重復性定義。
無服務器 Kubernetes 集群
分布式工作流 Argo 集群自帶計算環(huán)境,不需要手工創(chuàng)建和管理。提交工作流后,使用阿里云彈性容器 ECI,以 Serverless 方式運行工作流中的任務,不需要維護 Kubernetes 節(jié)點。利用阿里云的彈性能力,可以運行大規(guī)模工作流(數萬任務 Pod),同時使用數十萬核 CPU 的算力資源,在工作流運行完成后自動釋放資源。加快工作流運行速度,并節(jié)省計算成本。
總結
-
基于 Kubernetes 集群和開源 Argo Workflows 構建,以云原生的方式編排運行工作流,無廠商綁定風險;
-
復雜工作流任務的編排,可以應對數據處理、仿真計算,科學計算的復雜業(yè)務場景;
-
計算環(huán)境采用阿里云彈性容器 ECI,不需要維護節(jié)點;
-
大規(guī)模算力的按需使用,按量計費,避免工作流排隊等待,提高效率,節(jié)省計算成本。
Batch 批量計算和 Argo 工作流功能映射
能力分類描述 | Batch批量計算 | Argo Workflows |
---|---|---|
用戶體驗 | 批量計算CLI | Argo Workflows CLI |
Json定義作業(yè) | Yaml定義作業(yè) | |
SDK | SDK | |
核心能力 | 作業(yè)(Jobs) | 工作流(Workflows) |
Array jobs | 工作流(Workflows)Loops | |
Job dependencies | 工作流(Workflows)DAG | |
Job Environments Variables | 工作流(Workflows)Parameters | |
Automated Job retries | 工作流(Workflows)Retrying | |
Job timeouts | 工作流(Workflows)Timeouts | |
無 | 工作流(Workflows)Artifacts | |
無 | 工作流(Workflows)Conditions | |
無 | 工作流(Workflows)Recursion | |
無 | 工作流(Workflows)Suspending/Resuming | |
GPU jobs | 工作流(Workflows)指定GPU機型運行工作流 | |
Volumes | Volumes | |
Job priority | 工作流(Workflows)Priority | |
作業(yè)定義(JobDefinition) | 工作流模版(Workflows Templates) | |
計算環(huán)境 | Job queues | 無,云上Serverless彈性,作業(yè)無需排隊 |
計算環(huán)境(Compute Environment) | 無服務器Kubernetes集群 | |
生態(tài)集成 | 事件驅動 | 事件驅動 |
可觀察性 | 可觀測性 |
Argo 工作流示例
簡單工作流
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
在這個實例中,我們啟動了一個任務 Pod,使用 alpine 鏡像,運行 shell 命令 echo helloworld。在這個工作流基礎上,可以在 args 中,指定多個 shell 命令并執(zhí)行,也可以使用自定義鏡像運行鏡像中的命令。
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
在示例中,鏡像 print-pet 中打包了 pets.input 文本文件和 print-pet.sh 腳本文件,print-pet.sh 以 job-index 為輸入參數,打印 pets.input 文件行號為 job-index 的 pet。具體文件內容請訪問?GitHub 倉庫 [ 3] 。
在工作流中,會同時啟動 5 個 Pod,并分別傳入參數 job-index 1~5,每個 pod 根據輸入的 job-index 的值,打印相應行的 pet。通過 Loops 工作流可以實現數據分片和并行處理,加快海量數據的處理速度。更多 Loops 示例可以參考工作流(Workflows)Loops [ 4] 。
DAG 工作流(MapReduce)
真實的批處理場景中,往往需要多個 Job 配合完成,所以需要指定 Job 間的依賴關系,DAG 是指定依賴關系的最佳方式。但主流的 Batch 批處理系統(tǒng),需要通過 Job ID 指定 Job 依賴,由于 Job ID 需要在 Job 提交后才能獲取,因此需要編寫腳本實現 Job 間依賴(偽代碼如下),Job 較多時依賴關系不直觀維護代價高。
//Batch批處理系統(tǒng)Job間依賴,JobB 依賴 JobA,在JobA完成后運行。
batch submit JobA | get job-id
batch submit JobB --dependency job-id (JobA)
Argo 工作流可以通過 DAG 定義子任務間的依賴關系,示例如下:
# 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 倉庫 [ 5] 中,提供了一個 MapReduce 工作流示例,分片處理數據,并聚合計算結果。
如何遷移 Batch?批處理系統(tǒng)到?Argo 工作流
1. 評估與規(guī)劃
評估現有 Batch 批處理作業(yè),包括依賴關系,資源需求,參數配置等。了解 Argo Workflows 的特性和最佳實踐,并根據本文選擇 Argo workflows 的功能以替代 Batch 批處理作業(yè)。另外,由于分布式工作流 Argo 集群的 Serverless ECI 能力,您可以跳過規(guī)劃 Compute Environment 和管理優(yōu)先級隊列。
2. 創(chuàng)建分布式工作流 Argo 集群
參考文檔:工作流集群快速入門 [ 6]
3. 轉換作業(yè)定義
根據 Batch 批量計算到 Argo 工作流的功能映射,重寫 Batch 批量計算作業(yè)為 Argo 工作流,也可以通過調用 Argo 工作流?SDK [ 7] ,以自動化方式創(chuàng)建工作流,并接入業(yè)務系統(tǒng)。
4. 數據存儲
確保分布式工作流 Argo 集群可以訪問工作流運行所需要的數據,工作流集群可以掛在訪問阿里云 OSS,NAS,CPNS,云盤等存儲資源。參考使用存儲卷 [ 8] 。
5. 測試驗證
驗證工作流運行正常,數據訪問,結果輸出正常,資源用量符合預期。
6. 運維:監(jiān)控和日志
開啟分布式工作流 Argo 集群可觀察能力 [ 9] ,查看工作流運行狀態(tài)和日志。
總結
-
在用戶體驗、核心能力、計算環(huán)境和生態(tài)集成方面,Argo 工作流可以覆蓋主流 Batch 批處理系統(tǒng)的功能,同時在復雜工作流編排和計算環(huán)境管理方面強于 Batch 批處理系統(tǒng)。
-
分布式工作流 Argo 集群基于 Kubernetes 構建,工作流定義符合 Kubernetes Yaml 規(guī)范,子任務定義符合 Kubernetes Container 規(guī)范。如果您已經在使用 Kubernetes 運行在線應用,可以快速上手編排工作流集群,統(tǒng)一使用 Kubernetes 作為在線應用和離線應用的技術底座。
-
計算環(huán)境采用阿里云彈性容器 ECI,不需要維護節(jié)點,同時提供大規(guī)模算力的按需使用,按量計費,避免工作流排隊等待,提高運行效率,節(jié)省計算成本。
-
結合使用阿里云 Spot 示例,可以大幅降低計算成本。
-
分布式工作流適合 CICD,數據處理、仿真計算,科學計算等業(yè)務場景。
相關鏈接:
[1]?分布式工作流 Argo 集群
https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/overview-12?spm=a2c4g.11186623.0.0.3b33309fEXoH3j
[2]?Argo Workflows
https://argoproj.github.io/argo-workflows/
[3]?GitHub 倉庫
https://github.com/AliyunContainerService/argo-workflow-examples/tree/main/loops
[4]?工作流(Workflows)Loops
https://argo-workflows.readthedocs.io/en/latest/walk-through/loops/
[5]?Git 倉庫
https://github.com/AliyunContainerService/argo-workflow-examples/tree/main/map-reduce
[6]?工作流集群快速入門
https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/workflow-cluster-quickstart?spm=a2c4g.11186623.0.0.20555492DR5MCM
[7]?SDK
https://argoproj.github.io/argo-workflows/client-libraries/
[8]?使用存儲卷
https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/use-volumes?spm=a2c4g.11186623.0.0.12011428eDYQH1
[9]?可觀察能力文章來源:http://www.zghlxwxcb.cn/news/detail-820383.html
https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/observability/文章來源地址http://www.zghlxwxcb.cn/news/detail-820383.html
到了這里,關于云原生離線工作流編排利器 -- 分布式工作流 Argo 集群的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!