更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群

实例 DAG 介绍

DataLeap 是火山引擎自研的一站式大数据中台解决方案,集数据集成、开发、运维、治理、资产管理能力于一身的大数据研发治理套件。在平台中,一个核心的功能为任务的调度,会根据任务设置的调度频率(月级,日级,小时级等)运行任务,从而生成对应的实例。
 
在数仓研发中,不同的表之间会存在依赖关系,而产生表数据的任务实例,也会因此存在依赖关系。只有在上游实例运行成功、下游实例到达设定的运行时间且资源充足的情况下,下游实例才会开始执行。所以,在日常的任务运维中,常常需要分析实例上下游的运行情况,根据具体的情况对实例进行置成功、重跑等操作。
 
而如何清晰地展示实例之间的关系,帮助用户快速地分析整个链路的运行情况,并完成问题定位和运维操作,则是实例 DAG 需要解决的问题。下面对比下优化前后的效果。
 
优化前:
可以看到在复杂链路中,将所有节点的关系全部展示出来,导致连线混乱,需要通过不停的拖拽、缩放,才能找到没有执行的上游节点。
 
优化后:
通过采用了将节点聚合的形式,简洁地展示上下游关系。同时,采用了将实例状态进行分类的形式,提供快捷操作的按钮,让用户可以只关注特定状态的实例,减少了无用信息对用户运维操作的干扰。下面将详细介绍优化的整体过程。

概念

  1. 任务:在 DataLeap 数据研发平台中,对数据执行一系列操作的定义。
  2. 实例:通过任务配置的执行频率(月级、天级等)而创建的一个任务的快照。
  3. DAG:全称为 Directed Acyclic Graph,指有向无环图,具备严密的拓扑性质,有很强的流程表达能力。
  4. DAG 布局:指根据有向无环图中边的方向,自动计算节点层级和位置的布局算法。

业务场景

以其中一个场景为例:
对于任务 test_3 在 2022-09-29 的实例进行分析可知。当前实例没有运行,是由于上游任务 test_2 在 2022-09-29 的实例运行失败导致的,那么此时可联系上游实例对应的任务的负责人,对实例进行处理(包括但不限于重跑,置成功等操作)。

问题

在当前的实例 DAG 图中,用户在实际使用中会碰到如下问题:
  1. 复杂的实例 DAG 图无法渲染。
      在一些业务方向中,会出现 DAG 图中有几千节点。由于数据处理的复杂和采用了 svg 的渲染方案,常常会导致前端浏览器的崩溃。
  2. 同层级节点过多,操作困难。
      以下图为例,在分析上游实例中,是哪个实例没有运行,导致当前实例没有执行时,需要通过连续拖拽,才能定位到关注的上游实例。
  3. 查看节点依赖时,只能不断展开,在对不同的上游依赖进行展开时,会导致图展示混乱。

需求分析

在通过用户调研及使用过程中发现,使用 DAG 进行分析时主要有以下场景:
  1. 当前实例已经到达指定运行时间,但是没有运行。
      在这种情况下,用户关注的是上游没有运行的实例 / 运行失败的实例,联系上游实例的责任人进行问题定位。
  2. 当实例已经运行成功,但是完成时间比正常情况下有延迟。
      在这种情况下,用户关注的是上游实例中,最晚完成的实例。从而判断是否对链路进行治理优化。
  3. 当实例运行失败,导致下游没有运行。
      在这种情况下,用户关注的是依赖当前实例的所有下游实例,同时需要对下游实例进行聚合筛选,比如任务的优先级(代表任务的核心程度),以通知下游实例进行重跑等操作。
结合上面存在的问题可得到,主要原因是由于在复杂链路情况下,上述需求比较难满足。而在旧版的 DAG 中,针对简单链路和复杂链路的处理是一致的,为此,我们需要设计解决复杂链路场景下的方案。

功能设计

针对上面存在的问题以及对需求的分析,我们可以进行如下的功能实现与设计:

渲染方案替换

将 svg 的渲染方案替换成 canvas 渲染,通过减少页面中 DOM 的数量,提高前端渲染性能。

不同场景的功能设计

通过上面的需求分析,我们设计了不同的功能模式以满足不同的需求。
模式名称
功能
通用模式
分析上游阻塞下游运行的原因、查看上游最晚完成的实例
统计模式
对依赖当前实例的所有下游进行分组查看
链路模式
分析两个实例之间的链路关系

通用模式

在通用模式中,用户关注的是节点上下游的关系,在复杂链路中快速找到阻塞节点,同时关注阻塞节点的信息
针对复杂链路,我们设计了多种优化形式:
首先,在同一层的节点超过一定的数量(可自定义)后,所有节点将聚合在一起,我们称之为聚合节点。这种优化下,可以解决上面提到的由于同一层级节点过多,查找特定状态节点不便的问题。也支持点击聚合详情,通过列表的形式,查看所有被聚合的节点。并支持筛选,快速查找到关注的节点并通过展开,恢复与当前节点的依赖关系。
其次,以用户最关注的实例状态,对被聚合的节点进行分类,同时新增快捷展开操作。以下图为例,当前实例处于等待上游依赖完成状态,在这种情况下,用户关注的,则是上游没有开始执行的节点。在聚合节点中,可以清晰地看到存在一个实例,是在等待执行的,点击数字1,即可快速展开实例。
在这个例子中,就将不需要关注的上游成功节点隐藏在列表中,突出图所需要关注的重点信息。
同时,为了降低节点展示过多导致图显示杂乱的情况,新增了收起功能及跳转功能。
收起功能是指在通过在聚合节点展开的节点的情况,或是在直接展开上 / 下游的情况下,都支持对某个上游 / 下游节点的整条链路收起,方便用户在浏览完一条链路后,恢复图之前的状态,继续浏览下一条链路,减少对后续分析的干扰。
跳转功能是在查看当前节点的上游的其他下游,或是下游的其他上游,此时,用户关注的节点已经转化为其他的上游 / 下游节点。所以,通过跳转新页面的形式,将需要关注的不同节点的上 / 下游信息区分开,减少在一张图中展示所有信息。
并且由于图中的节点承载信息的能力有限,在通过点击节点时,会在下方出现与选中实例相关信息,包括属性,日志等,协助用户运维任务。
 

统计模式

  在统计模式中,用户关注的是依赖当前节点的下游节点,下游节点则可以分成直接下游和所有下游。所以设计了分层模式和合并模式,在这两种模式下,可以按照任务的属性(任务类型 / 实例状态 / 责任人等)作为分组维度。
  分层模式:
  合并模式:
 

链路模式

  指定上游节点,一键展示指定节点与当前节点的链路信息,从而进行精准链路分析。
 

技术实现

数据处理

在原始数据中,是以一个数组的形式返回节点信息及依赖关系。所以,需要对数据进行处理形成图所需要的数据,同时,利用多个 map 对数据进行存储,方便后续对数据进行检索,减少时间复杂度。

自定义节点注册

实例节点的样式需要通过基础图形 Text(文本)、Rect(矩形)、Icon(图标)进行组合,以达到我们的设计要求。

图预处理

在前面提到,我们需要在复杂的图场景中,将超过一定数量的同层节点聚合起来,以达到清晰直观地传达图所要表达的信息的目的,所以需要对图的层级及节点进行处理,从而生成聚合节点和去掉多余的节点。

DAG 图布局

通常来说,DAG 的布局可以按照以下步骤实现。
  1. 去环:包括自环和非自环,为节点分层做准备。
  2. 节点分层:给所有节点安排合适的层级。
  3. 节点排序:同层级内节点排序,减少相邻层级中节点连续的交叉点数量。
  4. 节点坐标分配:根据分层和同层节点的排序计算节点位置。
 
而在我们的场景中,节点的层级是有明确含义的,比如在节点 A 处于节点 B 的上方一层,且 A, B 之间有连线连接,则可认为 A 是 B 的上游一层节点。因此与传统 DAG 布局产生了以下不同点,我们需要根据场景做定制。
  1. 节点所在层级固定:DAG 布局既能支持自动计算层级,也能接受直接指定节点分层。
  2. 可能产生同层级连线:将同一层级里有连线的节点进行分组,进行内部排序后,视为整体再参与当前层级的排序,以减少交叉点的数量。

总结

从功能设计上,我们需要从用户的使用场景出发,区分不同的功能满足用户的诉求。同时,在前端领域中,针对大数据量的场景,需要判断这些大数据量的展示对用户是否存在价值,从大数据量中挖掘出用户的关注点并突出重点,方便用户快速地进行查看分析。
从技术实现上,我们需要结合业务,根据业务的特征去修改已有的 DAG 布局实现,以满足在不同的业务场景下,更好地将信息呈现给用户。
当然,当前的功能设计也存在不足之处,在当前的上游查看分析功能上,由于数据库查询存在瓶颈,只能分析一层的上游,在后续优化查询性能后,可以通过一键分析,直接查找到出现问题的根节点,可以帮助用户减少操作成本以提高分析效率。

参考

 

关于我们

火山引擎大数据研发治理套件DataLeap
一站式数据中台套件,帮助用户快速完成数据集成、开发、运维、治理、资产、安全等全套数据中台建设,帮助数据团队有效的降低工作成本和数据维护成本、挖掘数据价值、为企业决策提供数据支撑。

欢迎加入字节跳动数据平台官方群,进行数据技术交流、获取更多内容干货

 
点击跳转 大数据研发治理套件 DataLeap 了解更多
 

火山引擎DataLeap数据调度实例的 DAG 优化方案的更多相关文章

  1. 大数据量数据库设计与优化方案(SQL优化)

    转自:http://blog.sina.com.cn/s/blog_6c0541d50102wxen.html 一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的 ...

  2. 8月Meetup | “数据调度+分析引擎”解锁企业数字化转型之路

    ​ 编辑切换为居中 添加图片注释,不超过 140 字(可选)   大数据是一种规模大到在获取.存储.管理.分析方面大大超出了传统数据库软件工具能力范围的数据集合,而大数据作为企业运转的基础,只有经过提 ...

  3. 联童科技基于incubator-dolphinscheduler从0到1构建大数据调度平台之路

    联童科技是一家智能化母婴童产业平台,从事母婴童行业以及互联网技术多年,拥有丰富的母婴门店运营和系统开发经验,在会员经营和商品经营方面,能够围绕会员需求,深入场景,更贴近合作伙伴和消费者,提供最优服务产 ...

  4. 重新学习MySQL数据库3:Mysql存储引擎与数据存储原理

    重新学习Mysql数据库3:Mysql存储引擎与数据存储原理 数据库的定义 很多开发者在最开始时其实都对数据库有一个比较模糊的认识,觉得数据库就是一堆数据的集合,但是实际却比这复杂的多,数据库领域中有 ...

  5. [转帖]时序数据库技术体系 – InfluxDB TSM存储引擎之数据读取

    时序数据库技术体系 – InfluxDB TSM存储引擎之数据读取 http://hbasefly.com/2018/05/02/timeseries-database-7/  2018年5月2日   ...

  6. 火山引擎MARS-APM Plus x 飞书 |降低线上OOM,提高App性能稳定性

    通过使用火山引擎MARS-APM Plus的memory graph功能,飞书研发团队有效分析定位问题线上case多达30例,线上OOM率降低到了0.8‰,降幅达到60%.大幅提升了用户体验,为飞书的 ...

  7. MongoDB 存储引擎和数据模型设计

    标签: MongoDB NoSQL MongoDB 存储引擎和数据模型设计 1. 存储引擎 1.1 存储引擎是什么 1.2 MongoDB中的默认存储引擎 2. 数据模型设计 2.1 内嵌和引用 2. ...

  8. 各种JS模板引擎对比数据(高性能JavaScript模板引擎)

    最近做了JS模板引擎测试,拿各个JS模板引擎在不同浏览器上去运行同一程序,下面是模板引擎测试数据:通过测试artTemplate.juicer与doT引擎模板整体性能要有绝对优势: js模板引擎 Ja ...

  9. seo之google rich-snippets丰富网页摘要结构化数据(微数据)实例代码

    seo之google rich-snippets丰富网页摘要结构化数据(微数据)实例代码 网页摘要是搜索引擎搜索结果下的几行字,用户能通过网页摘要迅速了解到网页的大概内容,传统的摘要是纯文字摘要,而结 ...

  10. C#中使用SendMessage在进程间传递数据的实例

    原文:C#中使用SendMessage在进程间传递数据的实例 1 新建解决方案SendMessageExample 在解决方案下面新建三个项目:CopyDataStruct,Receiver和Send ...

随机推荐

  1. Python模拟服务端

    本机服务端 import socket # 获取到socket sk = socket.socket() # 获取到地址 ip 和 端口号 address = ('127.0.0.1', 8001) ...

  2. JDBC数据库编程(java实训报告)

    文章目录 一.实验要求: 二.实验环境: 三.实验内容: 1.建立数据库连接 2.查询数据 2.1 测试结果 3.添加数据 3.1.测试结果 4.删除数据 4.1.测试结果 5.修改数据 5.1 测试 ...

  3. Sentinel 介绍与下载使用

    sentinel 前方参考 计算QPS-Sentinel限流算法 https://www.cnblogs.com/yizhiamumu/p/16819497.html Sentinel 介绍与下载使用 ...

  4. webgl(three.js)3D光伏,3D太阳能能源,3D智慧光伏、光伏发电、清洁能源三维可视化解决方案——第十六课

    序: 能源是文明和发展的重要保障,人类命运不可避开的话题,无论是战争还是发展,都有它存在的身影.从石器时代到现代文明,人类的能源应用在进步,也在面临能源枯竭的危机与恐惧,而开发与应用可再生能源才是解决 ...

  5. 重大发现,AQS加锁机制竟然跟Synchronized有惊人的相似

    在并发多线程的情况下,为了保证数据安全性,一般我们会对数据进行加锁,通常使用Synchronized或者ReentrantLock同步锁.Synchronized是基于JVM实现,而Reentrant ...

  6. Java中String被称为不可变字符串的原因

    很多东西,看似可变,实际上不过是是新桃换旧符罢了. 代码: /** * String之所以被称为不可变字符串 */ static void testString(){ String str = &qu ...

  7. Pthread 并发编程(二)——自底向上深入理解线程

    Pthread 并发编程(二)--自底向上深入理解线程 前言 在本篇文章当中主要给大家介绍线程最基本的组成元素,以及在 pthread 当中给我们提供的一些线程的基本机制,因为很多语言的线程机制就是建 ...

  8. Vue3 —— 组件练习题(附源码)

    一.定义一个vue分页组件,实现客户端分页功能 1.1.子组件A(页数按钮) <!-- 本组件用于遍历分页的页数按钮 --> <template lang=""& ...

  9. 强软弱引用,ThreadLocal和内存泄漏

    强引用 写法:Object obj=new Object() 引用强度:最强 只要被引用着,就不会被gc(垃圾回收)回收掉. 软引用 写法:SoftReference<String> sr ...

  10. Go实现常用软件设计模式二:工厂模式

    目录: 举个栗子 概念介绍 使用场景 1.举个栗子 类图 ``` @startuml'https://plantuml.com/class-diagramclass Elephant { String ...