当前位置: 首页 > news >正文

dflow工作流使用1——架构和基本概念

        对于容器技术、工作流等概念完全不懂的情况下理解dflow的工作方式会很吃力,这里记录一下个人理解。

dflow涉及的基本概念

        工作流的概念很好理解,即某个项目可以分为多个步骤,每个步骤可以实现独立运行,只保留输入输出接口,把每个步骤按顺序串起来就形成了工作流。这样的框架的目的或作用是1、为用户提供一种标准的模板用于记录每个步骤要完成的事(工业上可以叫工序卡);2、负责管理工序执行顺序,收集记录和传递输入输出;3、向用户以友好的方式展示当前工作状态。

        dflow是一个基于argo工作流框架的框架,猜测是因为argo模板和执行顺序指令的制作缺乏标准化封装所以推出的。除了通常意义上的封装,dflow还实现了把带输入输出的python脚本打包成argo模板的功能,而原先要在argo里写python只能手写模板,这相当于实现了类似于自动代码生成的功能。

        如前面所述,工作流(workflow)是由一个个的步骤(step)组成的。因此要完成一个工作流的设计,用户需要定义每一个步骤(包括每个步骤接受的输入,执行的内容,以及输出),再将步骤按顺序串起来。要编写步骤,需要完成两件事:1、编写模板(template),模板中记载了输入输出的名称类型和数量,该模板要使用的工作环境,和具体的操作(比如将名为a.txt的文件内容读出,写入名为b.txt的文件中);2、编写步骤(step),即引用刚才编写好的模板,指定具体的输入输出文件。这个过程和函数调用很像,函数本身是模板,调用函数时的语句是步骤。

        下面的代码来自dflow-helloworld:

'''
这里开始定义名为Hello的模板对象。image是容器的镜像即工作环境,script是这个模板将要执行的linux shell脚本
'''
step1_templ = ShellOPTemplate(name="Hello",image="alpine:latest",script="echo {{inputs.parameters.msg}} > /tmp/msg.txt && echo {{inputs.parameters.number}} > /tmp/results.txt",
)#这里仍然在定义模板,定义了模板的输入输出。这块内容也可以在上面一块写,只是编程习惯的问题
step1_templ.inputs.parameters = {"msg": InputParameter(),"number": InputParameter(),
}
step1_templ.outputs.parameters = {"out_param": OutputParameter(value_from_path="/tmp/results.txt")
}
step1_templ.outputs.artifacts = {"out_art": OutputArtifact(path="/tmp/msg.txt")
}'''
这里引用了上面的模板,定义了一个步骤,并且赋予了具体的输入内容,即名为msg的字符串和名为number的数值
'''
step1 = Step (name="step1",template=step1_templ,parameters={"msg":"HelloWorld!", "number": 1},
)

        argo自身支持的模板有好几种,感觉dflow主要用的是HTTP template,即将整个工作流打包成一个json或yaml文件,通过http post到服务器端。dflow内部定义的shellOPtemplate,pythonOPtemplate等模板,写到最终这个json文件里其实本质结构都是一样的。在dflow的代码中,首先将dflow定义的对象转换为argo对象,再转为json。

工作流的架构

        对于上面提到的“工作环境”和“镜像”,则是容器技术领域的概念。argo是基于容器的,即使用容器技术,将各个step放到容器里去执行,可以理解为argo主程序开启了很多个虚拟机来执行这些step,并管理着这些虚拟机之间的输入输出。要使用容器,首先要安装容器引擎。kubernetes是大型服务集群上常用的平台,而对于小型任务可能过于麻烦,因此dflow使用的是docker+minikube,可以比较轻量化地实现kubernetes的功能。对于一个容器来说,他要具有执行代码的环境,比如是ubuntu还是centos,里面安装的是python还是gcc,python有哪些库等等。这些信息可以被打包成一个镜像来被容器使用。当在dflow中指定模板的镜像时,就指定了模板中代码的运行环境。虽说可以理解为虚拟机,但容器和镜像比虚拟机占用的资源要小得多,一个容器镜像大小在几百兆到1G左右,并且启动只需要数分钟。

        大致的架构是这样的:本地机器运行着docker+minikube,minikube中开启一个pod(最小调度单元,可以近似认为就是一个容器)运行着argo的几个主要进程。当通过dflow向argo提交工作流时,argo进程就会开启新的pod来执行工作流。这些pod可能在本地,也可以在远程服务器上。

安装过程阐释

        下面简单解释一下dflow的安装过程都在做些什么。以下内容来自

        https://github.com/kianpu34593/dflow_helloworld/blob/master/dflow-helloworld.ipynb

        1、安装docker+minikube,作为argo运行的基础。

        

        2、本地python安装dflow库,里面包含了dflow使用的库函数,作用是将定义的模板、步骤等转换为argo能接受的格式化文件,同时有些与argo服务器端通信的函数。(理论上dflow开启debug模式后也可以纯本地运行,不依赖argo)

        

        3、本地启动minikube,它会默认下载并使用一个1G多的镜像运行,在国内可以加个参数让下载更快些。这里注意如果步骤设计多进程并行任务,要指定好minikube的核数,否则工作流所面对的cpu数量不足,容器无法运行。

        

        4、在minikube中安装argo框架。先创建命名空间,之后的操作指定该命名空间后就可以实现操作上的隔离。安装框架时使用不同的源可能会安上不同版本的argo,版本不同会导致某些地方有问题。。。

        

        5、监测一下argo的几个pod运行状况,都running的话说明argo完全启动了

        

         6、将argo容器的端口转到本地上,2746是用于监测的界面,9000是一个叫minio的存储控制软件,负责管理各个pod产生的文件

        

        至此就可以运行dflow脚本提交工作流了。

 

 

 

 

相关文章:

dflow工作流使用1——架构和基本概念

对于容器技术、工作流等概念完全不懂的情况下理解dflow的工作方式会很吃力,这里记录一下个人理解。 dflow涉及的基本概念 工作流的概念很好理解,即某个项目可以分为多个步骤,每个步骤可以实现独立运行,只保留输入输出接口&#x…...

python小游戏课程设计报告,python游戏课程设计报告

大家好,给大家分享一下python2048游戏课程设计报告,很多人还不知道这一点。下面详细解释一下。现在让我们来看看!...

使用Windbg分析从系统应用程序日志中找到的系统自动生成的dump文件去排查问题

目录 1、尝试将Windbg附加到目标进程上进行动态调试,但Windbg并没有捕获到 2、在系统应用程序日志中找到了系统在程序发生异常时自动生成的dump文件 2.1、查看应用程序日志的入口 2.2、在应用程序日志中找到系统自动生成的dump文件 3、使用Windbg静态分析dump文…...

后端技术趋势指南|如何选择自己的技术方向

编程多条路,条条通罗马 后台大佬 后台路线都是面对后台服务器业务,比如web后台服务器,视频后台服务器,搜索后台服务器,游戏后台服务器,直播后台服务器,社交IM后台服务器等等,大部分…...

Delphi XE的原生JSONObject如何判断键值是否存在?

【问题现象】 Delphi XE的原生JSONObject,取出键值的时候如下: //json是传入的参数,里面包括"food_name"等之类的键值,没有food_type键值 procedure XXXXFunciton(json:TJSONObject) var strFoodName,strFoodType:S…...

Go Runtime功能初探

以下内容,是对 运行时 runtime的神奇用法[1] 的学习与记录 目录: 1.获取GOROOT环境变量 2.获取GO的版本号 3.获取本机CPU个数 4.设置最大可同时执行的最大CPU数 5.设置cup profile 记录的速录 6.查看cup profile 下一次堆栈跟踪数据 7.立即执行一次垃圾回收 8.给变量…...

01|Oracle学习(监听程序、管理工具、PL/SQL Developer、本地网络服务介绍)

基础概念 监听程序:运行在Oracle服务器端用于侦听客户端请求的程序。 相当于保安,你来找人,他会拦你,问你找谁。他去帮你叫人过来。 配置监听程序应用场景 Oracle数据库软件安装之后没有监听程序(服务)…...

滴滴数据服务体系建设实践

什么是数据服务化 大数据开发的主要流程分为数据集成、数据开发、数据生产和数据回流四个阶段。数据集成打通了业务系统数据进入大数据环境的通道,通常包含周期性导入离线表、实时采集并清洗导入离线表和实时写入对应数据源三种方式,当前滴滴内部同步中心…...

VBA技术资料MF36:VBA_在Excel中排序

【分享成果,随喜正能量】一个人的气质,并不在容颜和身材,而是所经历过的往事,是内在留下的印迹,令人深沉而安谧。所以,优雅是一种阅历的凝聚;淡然是一段人生的沉淀。时间会让一颗灵魂&#xff0…...

Shell脚本学习3

文章目录 Shell脚本学习3函数函数定义及使用函数参数获取函数返回值 重定向输入输出重定向 其他Here Document/dev/null 文件Shell文件包含获取当前正在执行脚本的绝对路径按特定字符串截取字符串 Shell脚本学习3 函数 函数定义及使用 函数可以让我们将一个复杂功能划分成若…...

代理模式--静态代理和动态代理

1.代理模式 定义:代理模式就是代替对象具备真实对象的功能,并代替真实对象完成相应的操作并且在不改变真实对象源代码的情况下扩展其功能,在某些情况下,⼀个对象不适合或者不能直接引⽤另⼀个对象,⽽代理对象可以在客户…...

C++容器——list的模拟实现

目录 一.list的基本结构 二. 接下来就是对list类构造函数的设计了: 三.链表数据的增加: 四.接下来就是迭代器的创建了: 四.简单函数的实现: 五.构造与析构 六.拷贝构造和赋值重载 传统写法: 现代写法: 七.迭…...

VUE3 祖孙组件传值调用方法

1.在 Vue 3 中,你可以使用 provide/inject 来实现祖孙组件之间的传值和调用方法。 首先,在祖组件中使用 provide 来提供数据或方法,例如: // 祖组件 import { provide } from vue;export default {setup() {const data Hello;c…...

我的网安之路

机缘 我目前从事网安工作,一转眼我从发布的第一篇文章到现在已经过去了4年了,感慨时间过得很快 曾经我是一名Java开发工程师所以我的第一篇文章是跟开发相关的那个时候还是实习生被安排 一个很难的工作是完成地图实时定位以及根据GPS信息模拟海上追捕,这对刚入职的我来说很难 …...

langchain-ChatGLM源码阅读:webui.py

样式定制 使用gradio设置页面的视觉组件和交互逻辑 import gradio as gr import shutilfrom chains.local_doc_qa import LocalDocQA from configs.model_config import * import nltk import models.shared as shared from models.loader.args import parser from models.load…...

<C++>二、 类和对象

1.面向对象和面向过程 C语言是面向过程的,关注的是过程,分析出求解问题的步骤, 通过函数调用逐步解决问题。 C是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。 2. C类 C…...

【HttpRunnerManager】搭建接口自动化测试平台实战

目录 一、需要准备的知识点 二、我搭建的环境 三、搭建过程 四、访问链接 五、两个问题点 【整整200集】超超超详细的Python接口自动化测试进阶教程,真实模拟企业项目实战!! 一、需要准备的知识点 1. linux: 安装 python3、nginx 安装和…...

【adb】adb常用命令

Android Debug Bridge (adb) Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作,例如安装和调试应用。adb 提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它…...

SAP 委外副产品业务

SAP 委外副产品业务 1.订单bom设置数量为负 2.采购收货时,副产品O库存增加,545 O 借:原材料 贷:委外加工-发出材料 3.从O库存调拨回本地库存,542...

高并发编程-2. 并发级别

此文章为笔记,为阅读其他文章的感受、补充、记录、练习、汇总,非原创,感谢每个知识分享者。 原文 文章目录 阻塞无饥饿(Starvation-Free)无障碍(Obstruction-Free)无锁(Lock-Free)无等待 由于临界区的存在,多线程之间的并发必须受…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

GitHub 趋势日报 (2025年06月08日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四&#xff…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...