01 说在后面
自“双碳”政策提出以来,开务数据库(原:云溪数据库)聚焦“数字能源”畛域,为用户打造数字能源管理平台,旨在晋升综合能源和碳资产治理能力。通过数字流买通能源流发明价值流,以数据为外围的生产因素,推动风、电、光伏等多种能源流与由数据形成的信息流深度交融。
数字能源管理平台不仅须要解决海量数据且并发度极高,通过能源设施的接入,依靠大数据及人工智能,买通物理世界与数字世界,联动信息流与能量流,突破能源品类边界,晋升设施效用。
为进步理论业务中计算资源应用效率,优化性能指标,开务重点优化了任务调度策略。DAG(Directed Acyclic Graph)调度是各行各业都会普遍存在的问题,尤其在遇到工作简单且相互间存在依赖的状况。那么明天咱们将为大家介绍 DAG 任务调度,并分享开务是如何实现将 DAG 与 go-streams 的联合并进行实际利用。
02 什么是 DAG?
DAG,有向无环图(Directed Acycling Graph):指图中没有回路(环)的有向图,是一类具备代表性的图,次要用于钻研工程项目的工序、进度等问题。
一个工程(Project)都可分为若干个流动(Active)的子工程(或工序),各个子工程受到肯定的条件束缚:某个子工程必须开始于另一个子工程实现之后;整个工程有一个开始点(终点)和一个起点。
对工程流动加以形象后,图的顶点示意流动,有向边示意流动之间的优先关系,这样的有向图称为用顶点示意流动的网(Activity On Vertex Network,AOV 网)。
通过 DAG 能够帮忙大家:预测工程是否顺利完成、找到影响工程的要害流动、估算整个工程实现所必须的最短时间等。由此可见,DAG 具备很高的实用价值。
03 什么是 go-streams?
go-streams 是用于 Go 的轻量级流解决库,提供了一种简略简洁的 DSL 来构建数据管道。
在理论计算中,管道(数据管道)是一组串联连贯的数据处理元件,其中一个元件的输入是下一个的输出。管道的元素通常以并行或工夫切片的形式执行,并须要在元素之间插入一定量的缓冲存储器。
在解决理论问题的建模过程中,个别是将工作分为多个顺次执行的解决步骤,步骤间通过传输数据相关联:一个步骤的输入是下一个步骤的输出,上游生产数据,上游生产数据。
go-streams 形象进去 Flow 接口,官网实现了常见的操作包含:Map、FlatMap、Filter、PassThrough、Split、FanOut、Merge、Throttler、SlidingWindow、TumblingWindow 等。
04 什么是任务调度?
任务调度,顾名思义是指能够把 ” 工作 ” 这个原子单位依照自组织形式进行调度,工作间可能相互依赖,通过简单的编排后即可造成一个 Workflow。
咱们心愿这个 Workflow 依照当时制订的调度形式去执行每个原子 Task,如下图所示:咱们心愿先并发运行 Task A 和 Task C,Task A 执行完后串联运行 Task B,并发期待 Task B 和 Task C 都完结后运行 Task D,这样就实现了一个典型的任务调度 Workflow。
后面提到了 DAG 的图构造,顶点元素称为 Vertex,顶点间的连线称为边 Edge。个别带箭头关系的称为有向图,箭头关系能造成环状的称为有环图,反之称为无环图。显然使用在任务调度 Workflow 中,DAG 有向无环图是最合适的。
05 任务调度与 go-streams 联合
图的存储构造有:邻接矩阵、邻接表和十字链表。咱们抉择通过 Map 实现的十字链表作为有向无环图的数据结构。这样能够用工夫复杂度查找出的邻边,并且代码可读性较高。
有向无环图的节点分为源节点、流节点和指标节点。源节点对应 go-streams 的源,文件能够是 Kafka、Redis、Txt 等;流节点就是 go-streams 的数据处理管道;指标节点对应 go-streams 的输入指标。
DAG 任务调度会依据图中邻接的入边和出边的数量,主动进行 Merge 和 Fanout。即如果某一个节点邻接的入边的数量大于 1,那么该节点在执行节点工作之前,会先进行 Merge;如果某一个节点邻接的出边的数量大于 1,那么该节点在执行节点工作之后,会进行 Fanout。
如图所示:1 和 2 是两个源,通过 3 和 4 别离用加法解决 1 和 2 两个源;而后 3 和 4 调用 Merge 操作,合成一个流;接着进行 6 的 Fanout 操作,生成两个雷同的流,别离流入 7 和 8;最终通过 7 和 8 的数字类型转成字符串,别离写入到 out1.txt 和 out2.txt 文件中。
06 总结回顾
通过 DAG 任务调度与 go-streams 的联合,实现基于 go-streams 并发执行工作,充分利用多核 CPU,进步整个工作流的执行速度。
数字能源管理平台波及繁冗的有流计算规定,同时包含基于规定的 DSL。通过 DAG 任务调度模块,不仅能够将规定进行对立的任务调度晋升效率,同时 DAG 任务调度很大水平上对代码进行简洁优化,升高冗余度,便于后续开发保护。