云原生离线工作流编排利器 -- 分布式工作流 Argo 集群

news2024/12/26 22:48:42

作者:庄宇

在现代的软件开发和数据处理领域,批处理作业(Batch)扮演着重要的角色。它们通常用于数据处理,仿真计算,科学计算等领域,往往需要大规模的计算资源。随着云计算的兴起,阿里云批量计算和 AWS Batch 等云服务提供了管理和运行这些批处理作业的平台。

随着云原生和 Kubernetes 生态的发展,越来越多的应用运行在 Kubernetes 之上,例如在线应用,中间件,数据库。那对离线任务和批量计算是否可以在 Kubernetes 这个统一平台之上运行,答案是肯定的,分布式工作流 Argo 集群 [ 1] ,基于开源 Argo Workflows [ 2] 项目,完全符合开源工作流标准,可以编排和运行离线任务和批量计算,并使用 Serverless 方式运行,降低运维复杂度,节省运行成本。

通过分布式工作流 Argo 集群,您可以轻松编排工作流,每个工作流步骤使用容器运行,可以在短时间内轻松运行大规模机器学习、仿真计算和数据处理等计算密集型作业,也可以快速运行 CI/CD 流水线。

图片

本文介绍主流 Batch 批量计算系统和分布式工作流 Argo 集群的区别,并讨论如何将离线任务和批量计算迁移到分布式工作流 Argo 集群。

Batch 批量计算的相关概念

图片

作业(Jobs)

一个任务单元(例如 shell 脚本、Linux 可执行文件或 Docker 容器镜像),可以提交给 Batch 批量计算系统,批量计算系统会在计算环境中分配计算资源并运行作业。

Array Jobs

Array Job 是指一系列相似或相同的作业(Jobs),这些作业作为一个数组批量提交并运行。每一个作业都有相同的作业定义,但可以通过索引来区分,每个作业实例处理不同的数据集或执行稍有差异的任务。

作业定义(Job Definitions)

作业定义指定了作业的运行方式。运行作业前需要先创建作业定义。作业定义一般包含:作业运行所使用的镜像,具体命令与参数,需要的 CPU/Memory 资源,环境变量,磁盘存储等。

作业队列(Job Queues)

向 Batch 批量计算系统提交作业时,会提交到指定的作业队列中排队,直到被调度运行。作业队列可以设置优先级,并指定关联的计算环境。

计算环境(Compute Environment)

计算环境是一组计算资源,可以运行作业。对计算环境需要指定虚拟机的机型,环境的最小、最大 vCPU 数量,以及 Spot 竞价实例的价格。

总结

  1. 用户需要学习 Batch 批量计算作业定义规范与用法,有厂商绑定风险;

  2. 还需要管理计算环境,设置机型和规模等,非 Serverless 方式,运维高;

  3. 由于计算环境规模的限制,需要管理作业队列以设置作业的优先级,复杂度高。

分布式工作流 Argo 集群的相关概念

图片

模版(Templates)

模版定义了一个任务(作业),是工作流的组成部分,一个工作流至少要包含一个模版。模版中包含要运行的 Kubernetes 容器和相应的输入输出参数。

工作流(Workflows)

工作流包含一个或者多个任务(模版),并可以编排多个任务,支持定义复杂的任务流程,如序列化、并行化任务,以及在条件满足时执行特定的任务。创建工作流后,工作流中的任务,会在 Kubernetes 集群中以 Pod 形式运行。

工作流模版(Workflow Templates)

工作流模版是可复用的工作流的静态定义,类似于函数,可以在多个工作流中被引用并运行。在定义复杂工作流时可以复用已有的工作流模版,减少重复性定义。

无服务器 Kubernetes 集群

分布式工作流 Argo 集群自带计算环境,不需要手工创建和管理。提交工作流后,使用阿里云弹性容器 ECI,以 Serverless 方式运行工作流中的任务,不需要维护 Kubernetes 节点。利用阿里云的弹性能力,可以运行大规模工作流(数万任务 Pod),同时使用数十万核 CPU 的算力资源,在工作流运行完成后自动释放资源。加快工作流运行速度,并节省计算成本。

总结

  1. 基于 Kubernetes 集群和开源 Argo Workflows 构建,以云原生的方式编排运行工作流,无厂商绑定风险;

  2. 复杂工作流任务的编排,可以应对数据处理、仿真计算,科学计算的复杂业务场景;

  3. 计算环境采用阿里云弹性容器 ECI,不需要维护节点;

  4. 大规模算力的按需使用,按量计费,避免工作流排队等待,提高效率,节省计算成本。

Batch 批量计算和 Argo 工作流功能映射

能力分类描述Batch批量计算Argo Workflows
用户体验批量计算CLIArgo Workflows CLI
Json定义作业Yaml定义作业
SDKSDK
核心能力作业(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机型运行工作流
VolumesVolumes
Job priority工作流(Workflows)Priority
作业定义(JobDefinition)工作流模版(Workflows Templates)
计算环境Job queues无,云上Serverless弹性,作业无需排队
计算环境(Compute Environment)无服务器Kubernetes集群
生态集成事件驱动事件驱动
可观察性可观测性

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 命令并执行,也可以使用自定义镜像运行镜像中的命令。

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 批处理系统,需要通过 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 定义子任务间的依赖关系,示例如下:

图片

# 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 批处理系统到 Argo 工作流

1. 评估与规划

评估现有 Batch 批处理作业,包括依赖关系,资源需求,参数配置等。了解 Argo Workflows 的特性和最佳实践,并根据本文选择 Argo workflows 的功能以替代 Batch 批处理作业。另外,由于分布式工作流 Argo 集群的 Serverless ECI 能力,您可以跳过规划 Compute Environment 和管理优先级队列。

2. 创建分布式工作流 Argo 集群

参考文档:工作流集群快速入门 [ 6]

3. 转换作业定义

根据 Batch 批量计算到 Argo 工作流的功能映射,重写 Batch 批量计算作业为 Argo 工作流,也可以通过调用 Argo 工作流 SDK [ 7] ,以自动化方式创建工作流,并接入业务系统。

4. 数据存储

确保分布式工作流 Argo 集群可以访问工作流运行所需要的数据,工作流集群可以挂在访问阿里云 OSS,NAS,CPNS,云盘等存储资源。参考使用存储卷 [ 8]

5. 测试验证

验证工作流运行正常,数据访问,结果输出正常,资源用量符合预期。

6. 运维:监控和日志

开启分布式工作流 Argo 集群可观察能力 [ 9] ,查看工作流运行状态和日志。

总结

  1. 在用户体验、核心能力、计算环境和生态集成方面,Argo 工作流可以覆盖主流 Batch 批处理系统的功能,同时在复杂工作流编排和计算环境管理方面强于 Batch 批处理系统。

  2. 分布式工作流 Argo 集群基于 Kubernetes 构建,工作流定义符合 Kubernetes Yaml 规范,子任务定义符合 Kubernetes Container 规范。如果您已经在使用 Kubernetes 运行在线应用,可以快速上手编排工作流集群,统一使用 Kubernetes 作为在线应用和离线应用的技术底座。

  3. 计算环境采用阿里云弹性容器 ECI,不需要维护节点,同时提供大规模算力的按需使用,按量计费,避免工作流排队等待,提高运行效率,节省计算成本。

  4. 结合使用阿里云 Spot 示例,可以大幅降低计算成本。

  5. 分布式工作流适合 CICD,数据处理、仿真计算,科学计算等业务场景。

相关链接:

[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] 可观察能力

https://help.aliyun.com/zh/ack/distributed-cloud-container-platform-for-kubernetes/user-guide/observability/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1406342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【趣味CSS3.0】粘性定位属性Position:sticky是不是真的没用了?

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起学习和进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&a…

Windows下安装达梦8开发版数据库

达梦数据库属于国产主流数据库之一&#xff0c;本文记录WIndows下安装最新的达梦8数据库的过程。   达梦官网&#xff08;参考文献1&#xff09;下载开发版&#xff08;X86平台&#xff09;版安装包&#xff0c;如下图所示&#xff1a; 解压安装包后&#xff0c;其中包含ISO文…

打 jar 包运行 在windows 平台控制台和日志 乱码解决

--拒絕鷄巴囉嗦&#xff0c;直接解決問題 我们在Windows下运行jar包时&#xff0c;常常会出现乱码&#xff0c;主要分为dos窗口输出的日志中出现乱码和程序返回数据出现乱码。 dos窗口输出的日志中出现乱码 执行如下命令&#xff0c;将控制台输出编码改为UTF8&#xff1a; ch…

BL0942 内置时钟免校准计量芯片 用于智能家居领域 上海贝岭 低成本 使用指南

BL0939是上海贝岭股份有限公司开发的一款用于智能家居领域进行电能测量的专用芯片&#xff0c;支持两路测量&#xff0c;可同时进行计量和漏电故障检测&#xff0c;漏电检测电流可设&#xff0c;响应时间快&#xff0c;具有体积小&#xff0c;外围电路简单&#xff0c;成本低廉…

springboot集成tess4j

spring整合tess4j用于OCR识别图片&#xff0c;在windows环境识别正常&#xff0c;在liunx没有反应&#xff0c;本文用于解决部署linux问题。 整合springboot 1、引入pom文件 <dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess…

HTML标题

我的HTML标题学习小记 HTML的标题功能真的非常实用&#xff01;它们就像是文章的大纲&#xff0c;帮助网页内容呈现出清晰的结构&#xff0c;也就是小题大作一番。 HTML标题的奥秘 在HTML中&#xff0c;我们使用<h1>至<h6>这些标签来定义标题。其中&#xff0c;…

​ElasticSearch

目录 简介 基本概念 倒排索引 FST 简介 ES是一个基于lucene构建的&#xff0c;分布式的&#xff0c;RESTful的开源全文搜索引擎。支持对各种类型的数据的索引&#xff1b;搜索速度快&#xff0c;可以提供实时的搜索服务&#xff1b;便于水平扩展&#xff0c;每秒可以处理 …

GitHub无法完成推送 的设置选项

GitHub无法完成推送 的设置选项 系统设置 VS中控制台设置【指令】 控制台调出方法 以下为VS控制台指令 git config --global --unset http.proxy git config --global --unset https.proxygit config --global http.proxy 127.0.0.1:7890 git config --global https.proxy …

http503错误是什么原因

HTTP503错误在站长圈很经常遇到&#xff0c;很多网站站长经常遇到的HTTP503错误经常会不知道怎么去解决它。今天我们就来针对HTTP503错误问题展开说说。HTTP503错误是指服务器暂时无法处理客户端的请求&#xff0c;常常出现在服务器超负荷或维护期间。在这种情况下&#xff0c;…

深入分析 Linux 网络丢包问题

热门IT课程【视频教程】-华为/思科/红帽/oraclehttps://xmws-it.blog.csdn.net/article/details/134398330 所谓丢包&#xff0c;是指在网络数据的收发过程中&#xff0c;由于种种原因&#xff0c;数据包还没传输到应用程序中&#xff0c;就被丢弃了。这些被丢弃包的数量&#…

canvas绘制美国国旗(USA Flag)

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

burp靶场--跨域资源共享(CORS)

burp靶场–跨域资源共享&#xff08;CORS&#xff09; https://portswigger.net/web-security/cors ### 跨域资源共享&#xff08;CORS&#xff09; 在本节中&#xff0c;我们将解释什么是跨域资源共享 (CORS)&#xff0c;描述基于跨域资源共享的攻击的一些常见示例&#xff…

链表的经典算法OJ题

前言 hello&#xff0c;大家好呀&#xff0c;我是Humble&#xff0c;本篇博客要分享的内容是关于链表的一些力扣OJ题 OK&#xff0c;废话不多说&#xff0c;我们直接开始吧~ 题目一 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你一个…

C# 使用屏障来使多线程并发操作保持同步

写在前面 以下是微软官方对屏障类的介绍&#xff0c;System.Threading.Barrier 可用来作为实现并发同步操作的基本单元&#xff0c;让多个线程(参与者)分阶段并行处理目标算法。在达到代码中的屏障点之前&#xff0c;每个参与者将继续执行&#xff0c;屏障表示工作阶段的末尾&…

机器学习实验3——支持向量机分类鸢尾花

文章目录 &#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;数据预处理&#x1f9e1;&#x1f9e1;代码认识数据相关性分析径向可视化各个特征之间的关系图 &#x1f9e1;&#x1f9e1;支持向量机SVM求解&#x1f9e1;&#x1f9e1;直觉…

单调栈笔记

单调栈 1.每日温度2.下一个更大元素 I3.下一个更大的元素4.接雨水5.柱状图中最大的矩形 单调栈正如其名字&#xff0c;用一个栈&#xff08;能够实现栈性质的数据结构就行&#xff09;来存储元素&#xff0c;存储在栈中的元素保持单调性&#xff08;单调递增或者是单调递减&…

SE通道注意力机制模块

简介 论文原址&#xff1a;https://arxiv.org/pdf/1709.01507.pdf 在深度学习领域&#xff0c;提升模型的表征能力一直是一个关键的研究方向。SE&#xff08;Squeeze-and-Excitation&#xff09;模块是一种引入通道注意力机制的方法&#xff0c;旨在让神经网络更加关注对当前…

5_机械臂运动学基础_矩阵

上次说的向量空间是为矩阵服务的。 1、学科回顾 从科技实践中来的数学问题无非分为两类&#xff1a;一类是线性问题&#xff0c;一类是非线性问题。线性问题是研究最久、理论最完善的&#xff1b;而非线性问题则可以在一定基础上转化为线性问题求解。 线性变换&#xff1a; 数域…

活动回顾丨云原生技术实践营上海站「云原生 AI 大数据」专场(附 PPT)

AI 势不可挡&#xff0c;“智算”赋能未来。2024 年 1 月 5 日&#xff0c;云原生技术实践营「云原生 AI &大数据」专场在上海落幕。活动聚焦容器、可观测、微服务产品技术领域&#xff0c;以云原生 AI 工程化落地为主要方向&#xff0c;希望帮助企业和开发者更快、更高效地…

机器学习期末复习总结笔记(李航统计学习方法)

文章目录 模型复杂度高---过拟合分类与回归有监督、无监督、半监督正则化生成模型和判别模型感知机KNN朴素贝叶斯决策树SVMAdaboost聚类风险PCA深度学习范数计算梯度下降与随机梯度下降SGD线性回归逻辑回归最大熵模型适用性讨论 模型复杂度高—过拟合 是什么&#xff1a;当模型…