火山引擎 DataLeap 构建Data Catalog系统的实践(三):关键技术与总结

news2025/1/11 12:34:27

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

关键技术

构建一个好的Data Catalog系统,需要考虑的核心产品设计和技术设计有很多。篇幅所限,本文只概要介绍技术设计中最核心重要的部分,更多细节展开可参照后续的文章。

数据模型统一

将不同元数据的数据模型统一,是降低接入成本和维护成本的重要前提。系统的数据模型,火山引擎 DataLeap 研发人员基本参照了Apache Atlas的设计与实现。一些基本概念简单介绍如下:

  • 类型(Type):描述一类元数据,由多个属性组成。例如,hive table是一类元数据,hive_db也是一类元数据。Type可具备继承关系。按面向对象的编程思想,可以理解type为一个Class。

  • 实例(Entity):代表一个type的具体事例。一个entity可能作为一个属性存在于另一个entity中,例如hive_table中的db属性,db本身也是一个entity。在面向对象的编程思想中,一个entity可以认为是一个class的instance。

  • 属性(Attribute):属性的集合组合而成为一个Type。属性本身的类型(typeName)可能是一个自定义的type,也可能是一种基础类型,包括date,string等。例如,db是hive_table的一个属性,column也是hive_table的一个属性。

  • 关系(Relationship):一种特殊的Entity,用以描述两个Entity之间的关联模式。

在实际应用这套类型系统时,我们有两个方面比较有特点:

  1. 继承与组合的广泛使用

 

字节的业务场景十分复杂,为了充分复用各种元数据类型之间的相似能力,又获得足够的定制灵活性,火山引擎 DataLeap 研发人员为每类元数据设计了父Type。比如,Hive Table和Clickhouse Table,都含有名称、描述、字段等属性,他们都继承自DataStore这个父Type。

另外一种情况,有些类型的实体可以作用于多种其他的实体,比如一张Hive表和一堆被组织在一起的业务报表,都可以被用户收藏或点赞。我们将收藏、点赞这些行为也抽象为实体,并通过关系与Hive表、业务报表集合等相关联。这种思想,类似编程中的组合或者是切面的概念。

  1. 调整类型加载机制

在实践中我们意识到,跟某种数据源相关联的能力,应该尽可能收敛到一起,这可以极大的降低后续的维护成本。对于一种元数据类型定义,也在这种考虑的范围之内。火山引擎 DataLeap 研发人员调整了Apache Atlas加载类型文件的机制,使其可以从多个package,以我们定义过的目录结构和先后顺序加载。这也为后面的标准化奠定了基础。

数据接入标准化

为了最终达成降低接入和维护成本的目标,统一了类型系统之后,第二步就是接入流程的标准化。

火山引擎 DataLeap 研发人员将某一种元数据类型的接入逻辑封装为一个connector,并通过提供SDK的方式简化connector的编写成本。

以使用最广泛的T+1 bridge接入的connector SDK为例,我们参照时下流行的Flink流式处理框架,结合T+1 bridge的业务特点,实现了如下模型:

 

  • Source:从外部存储计算系统等批量拉取最新的全量元数据。数据结构和字段通常由外部系统决定。概念上可对齐Flink的source operator。

  • Diff Operator:接收source的输出,并从Catalog Service拉取当前系统中的全量元数据,做差异对比,产出差异的部分。概念上对齐Flink中的某一种自定义的ProcessFunction。

  • Event Generate Operator:接收Diff Operator的输出,根据Catalog系统定义好的格式,将差异的metadata转化成event格式,比如对于新建的metadata,转换成CreateEvent。概念上对齐Flink中的某一种自定义的ProcessFunction。

  • Sink:接收Event Generate Operator的输出,将差异的metadata写入Ingestion Service。概念上对齐Flink的sink operator。

  • Bridge Job:组装pipeline,做运行时控制。概念上对齐Flink的Job。

当需要接入新的元数据时,通常只需要重新编写Source和Diff Operator,其他组件都是可直接复用的。标准化的connector极大的节省接入和运维成本。

搜索优化

搜索是Data Catalog中,除了详情浏览外,最广泛使用的功能,也是数据消费者找数最主要的手段。在火山引擎 DataLeap 系统中,每天有70%以上的用户都会使用搜索功能。

搜索是一个相对成熟的技术领域,针对元数据的检索可以看作是垂直领域的搜索引擎。本节概要介绍在设计实现元数据搜索引擎时的收获,更多的细节展开,会有后续的文章。

在实际场景中,火山引擎 DataLeap 研发人员发现公司内的元数据搜索,与通用搜索引擎相比,有两个十分显著的特点:

  • 搜索中存在部分很强的Pattern:用户搜索元数据时,有一些隐式的习惯,通过挖掘埋点中的固定pattern,给了我们针对性优化的机会。

  • 行为数据规模有限:公司内部的元数据搜索用户,通常是千级别,而每天搜索的点击次数是万级别,这个规模远远小于对外的通用搜索引擎,也造成很多模型没法及时收敛,但也一定程度上给与我们简化问题的机会。

 

火山引擎 DataLeap 研发人员设计的元数据搜索,架构如上图所示。粗略来看,可以划分为两大部分:

  • 离线部分:负责汇集各类与搜索相关的数据,做数据清洗或者模型训练,根据不同的用途,写入不同的存储,供给在线搜索模块使用。

  • 在线部分:分为搜索理解、召回、精排三个主要阶段,步骤和概念上与通用搜索引擎对齐。

针对上面分析的特点,火山引擎 DataLeap 研发人员在搜索优化时,有两个对应的策略:

  • 对于强Pattern,广泛使用Rule-Based的优化手段:比如,火山引擎 DataLeap 研发人员发现很大一部分用户在搜索Hive时,会使用“库名.表名”的pattern,在识别到query语句中有“.”时,火山引擎 DataLeap 研发人员会优先尝试根据库名和表名检索

  • 激进的个性化:因用户规模可控,且某位用户通常会频繁使用某个领域的元数据,火山引擎 DataLeap 研发人员记录了很多用户的历史行为细节,当query语句与过去浏览过元数据有一定文本相关性时,个性化相关的得分会有较大提升

血缘能力

血缘能力是Data Catalog系统的另外一个核心能力。自动化的,端到端的血缘能力,是很多业界系统宣称的亮点功能。构建完备的血缘能力,既可以帮助生产者梳理、组织他们负责的元数据,也可以帮助数据消费者找数和理解数据的上下文。

字节非常关注数据价值,业务也复杂,对我们数据血缘链路的建设也提出了很高的要求。本节只概要介绍火山引擎 DataLeap 研发人员搭建血缘链路时考虑的核心问题,更多细节可以参照之前的文章:字节跳动内部的数据血缘用例与设计。

首先,数据血缘的系统边界是:从RDS和MQ开始,一路途径各种计算和存储,最终汇入指标、报表和数据服务系统。

其次,在设计系统时,火山引擎 DataLeap 研发人员充分考虑了血缘链路的多样性和复杂性。如下图所示,火山引擎 DataLeap 研发人员通过T+1和近实时的方式,获取各类任务系统中的信息,根据任务类型,调用不同的解析服务,将格式化过的血缘数据写入Data Catalog系统,供给下游的API调用或者MQ、离线数仓消费。

 

最后,在血缘质量衡量上,火山引擎 DataLeap 研发人员通过定义有效的血缘准确率、覆盖率和时效性,来确保血缘信息的准确、全面和实时性。

当前,我们的血缘能力已经广泛应用于字节的数据资产、数据开发和数据治理等领域。

存储层优化

如前面介绍,在存储层,火山引擎 DataLeap 研发人员借用了Atlas的设计与实现。Atlas的底层使用JanusGraph做图引擎。JanusGraph 是基于Gremlin 图查询语义实现的计算引擎,其底层存储支持HBase/Cassadra/BerkeleyDB等KCV结构的存储,同时,使用ElasticSearch作为索引查询支持。

当火山引擎 DataLeap 研发人员将越来越多的元数据接入系统,图存储中的点和边分别到达百万和千万量级,读写性能都遇到了比较大的问题。我们做了部分源码的修改,这边介绍其中比较重要的两个,更多细节请参照后续的文章。

读优化:开启MutilPreFetch 能力

在我们的图库中,存在很多超级点,也就是关系十分庞大的元数据。举两种情况,一是列十分多的大宽表,对于一些机器学习的表,甚至会超过1万列;另外一种情况是被广泛引用的底表,比如埋点底表的一级血缘下游就超过了1万。在读取这类数据时,我们发现性能极差。

与关系型数据库慢查询优化类似,我们通过监控埋点收集到慢查询语句,借助gremlin的profile函数,分析query plan中的问题,并通过构建索引或者改写语句与配置等,做相应的优化。

开启JanusGraph的MutilPreFetch查询开关,是其中一种情况。该特性的大致实现原理是,在属性过滤的时候, 批量并行获取所有关联顶点的属性,再在内存做属性过滤,而未开启该特性时,则会找到对端的顶点后,每个顶点单独去获取属性再做过滤条件。

 

需要注意的是,该机制在触发优化时的前置条件

Janusgraph 0.4版本以上且配置打开

语句中不包含limit

语句中包含has

查询结果行数不超过cache.tx-cache-size值

写优化:去除Guid全局唯一性检查

对于超大元数据的写入请求,也有比较严重的性能问题。比如超过3000列的写入,火山引擎 DataLeap 研发人员发现需要消耗接近15分钟。

通过模拟单个超大表写入,并使用arthas火焰图跟踪相关代码, 火山引擎 DataLeap 研发人员发现在每个JanusGraph图顶点写入时,都会做guid的全局唯一性校验,这里十分耗时。

 

通过分析,火山引擎 DataLeap 研发人员发现guid在全局上默认是唯一的,没有必要做这个唯一性检查,同时,我们定义了业务语义上全局唯一的qualifiedName,以此减少不必要的唯一性重复检查。

配合其他的优化,我们在一次写入大量节点时,节省不少开销,最终性能大致如下:

优化前

优化后

小表(10列以内)

1~2s

<100ms

中表(100-500列)

3-5min

2~5s

超大表(3000列以上)

15min以上,经常写入失败

0.5~1min,可写入

未来工作

文中阐述的部分Data Catalog技术和产品功能已经通过火山引擎大数据研发治理套件 DataLeap 对外开放

接下来,火山引擎 DataLeap 研发人员提升Data Catalog系统,会主要集中在以下几个方面:

首先,是将元数据往数据资产转化。当前,我们收集了丰富的技术类元数据和一部分业务类元数据,如何将各类元数据,与真实的业务场景关联,将没有直接业务价值的元数据转化为有直接业务价值的数据资产,是我们正在探索的方向。

其次,是更广泛的应用智能能力。Data Catalog中有很多可以落地的智能化场景,比如搜索推荐,自动打标等,我们已经做了一些基础的尝试,接下来会进行更广泛的推广。

最后,开放能力的搭建。在元数据接入方面,我们准备将其封装成产品能力,提供类似connector市场的功能,便于在ToB市场做更敏捷的合作与推广;另外计划与开源和商用的敏捷报表等做更好的打通,可以将系统能力展现在各类报表系统里。

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

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

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

相关文章

工作日志2 input 的事件优先级 字符串.trim() this.$set()的应用 获取jq的自定义属性

input 的事件优先级 1.input输入框的事件 字符串.trim() 除去前后空格的方法 undefind不可以使用 this.$set()的应用

苹果Mac动态壁纸软件Dynamic Wallpaper

Dynamic Wallpaper 是一款桌面壁纸管理软件&#xff0c;它提供了动态壁纸的功能。动态壁纸是指可以在一段时间内自动更改外观的壁纸&#xff0c;比如根据时间或其他条件进行变化。这种壁纸可以为用户提供更加生动有趣的桌面体验。 Dynamic Wallpaper 软件具有以下特点和功能&am…

基于Java+SpringBoot+Vue的中小企业财务管理系统设计与实现

博主介绍&#xff1a;✌擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案…

Word之解决中文和英文混写导致字间距增大的问题(六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【2023裸辞失业后之初学Docker1】

目录 Docker简介docker下载安装常用命令帮助启动类命令镜像命令容器命令 镜像分层概念commit命令本地镜像发布到腾讯云 docker容器数据卷宿主机和容器内添加容器卷案例读写规则容器卷的继承 学习视频来自 https://www.bilibili.com/video/BV1gr4y1U7CY Docker简介 Docker出现…

DNS协议解析原理

0. 前言 为了保证网址的正常访问&#xff0c;域名解析协议&#xff08;DNS&#xff09;其实在背后做出了很多努力&#xff0c;本文将透彻讲解 DNS 协议的原理&#xff0c;了解我们每天都在接触的网址到底是怎么工作的。 1. 什么是 DNS 协议 在学习 DNS 协议之前&#xff0c;我…

你真的不想知道ai绘画工具有哪些吗?

近期我发现了一个超酷的玩意儿&#xff0c;叫做ai绘画工具。没错&#xff0c;它就是那个能让你在不懂任何绘画技巧的情况下&#xff0c;也能创作出令人惊叹的艺术作品的神奇东西&#xff01;简直就像是给你一支魔法画笔&#xff0c;让你成为真正的艺术大师。但是&#xff0c;市…

Java设计模式之行为型-备忘录模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 一、基础概念 备忘录模式是一种行为型设计模式&#xff0c;它允许保存一个对象的内部状态到一个备忘录对象中&#xff0c;这样就可以在需要的时候恢复这个对象的状态了&#xff0c;同时又不违反封装…

1.5 纹理

这次笔记时间有点久&#xff0c;主要是这节课讲的东西需要很多基础来铺垫&#xff0c;看完了后感觉缺失信息很多&#xff0c;又去补了GAMES 101 3~10节内容。 强烈建议看不懂的先去学习GMAES101 网址Lecture 08 Shading 2 (Shading, Pipeline and Texture Mapping)_哔哩哔哩_bi…

你知道哪些Linux 发行版采用 了KDE Plasma 吗

Linux操作系统以其高度的灵活性和可定制性而闻名&#xff0c;有许多不同的发行版适用于各种场合和需求。其中一种备受欢迎的桌面环境是KDE Plasma&#xff0c;它提供了现代化的外观、丰富的功能和高度自定义的选项。那么&#xff0c;你知道哪些Linux发行版采用了KDE Plasma呢&a…

python遍历整个网站寻找所有输入框并提交表单

文章目录 一、遍历查找网站所有输入框二、对找到的输入框实现自动表单提交三、实现留言板和其他输入框的表单提交 一、遍历查找网站所有输入框 # 查找所有表单 import requests from bs4 import BeautifulSoup import sys# 定义起始页面 url sys.argv[1]# 通过requests库获取…

Linux下如何部署Nuxt项目(二)

Linux下如何部署Nuxt项目(一)_小鸟哗啦啦的博客-CSDN博客&#xff0c;书接上回&#xff0c;以实际场景开始。 请认真看完这篇文章&#xff0c;还不会部署Nuxt&#xff0c;我直接拿弹弓打你们家玻璃&#xff01; 一、nuxt的配置检查 服务端渲染的应用&#xff0c;应该是先编译构…

智能手表学习笔记

一、相关知识模块 1、RTOS & FreeRTOS &#xff08;1&#xff09; RTOS 实时操作系统&#xff08;Real Time Operating System&#xff09; 是指当外界事件或数据产生时&#xff0c;能够接受并以足够快的速度予以处理&#xff0c;其处理的结果又能在规定的时间之内来控制…

信号完整性分析基础知识之有损传输线、上升时间衰减和材料特性(二):损耗的来源

导体电阻和趋肤深度 信号沿信号路径和返回路径传播的串联电阻与导体的体电阻率和电流传播的横截面有关。直流时&#xff0c;信号导体中的电流分布均匀&#xff0c;电阻为&#xff1a; ρ表示电阻的体电阻率&#xff0c;w表示线宽&#xff0c;t表示导体厚度&#xff0c;Len表示走…

7.10蓝桥杯刷题

public class _求阶乘和 {public static void main(String[] args) {// 根据已有的知识 可以知道的是&#xff0c;现在要求s的末尾九位数字&#xff0c;已知的是39之后的阶乘他的后九位都是0;//所以不需要计算到2023的阶乘//一个数求出来的阶乘想要末尾有0//数中必须要有2和5&a…

C语言每日一练(3)

C 练习实例6 题目&#xff1a;用*号输出字母C的图案。 程序分析&#xff1a;可先用*号在纸上写出字母C&#xff0c;再分行输出。 程序源代码&#xff1a; #include "stdio.h" int main() {printf("用 * 号输出字母 C!\n");printf(" ****\n")…

小红书数据分析工具|年轻人入玄门?小红书热门笔记大赏

当代年轻人血脉觉醒&#xff0c;逐渐出现寺庙打卡、电子木鱼、发疯语录“在上进和上班之间&#xff0c;选择上香”&#xff0c;小编观察近期彩票成为年轻人信仰的新玄学&#xff0c;兴起了“送礼就送刮刮乐”的小风潮。卷不动躺不平的年轻人&#xff0c;严重精神内耗下&#xf…

Pycharm中设置动态模板(自定义自动补齐)

Settings——Editor——Live Template——点击号新增动态模板 Abbreviation缩略词&#xff1a;输入的简写内容 Template text: 简写词对应的模板内容 默认输入简写内容按Tab键&#xff0c;生成模板内容 Define: 选择在哪个语言环境下生效

【WebSocket】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 3.1 介绍3.2 入门案例3.2.1 案例分析3.2.2 代码开发3.2.3 功能测试 4. 来单提醒4.1 需求分析和设计4.2 代码开发4.3 功能测试 5. 客户催单5.1 需求分析和设计5.2 代…

接口自动化测试,一键快速校验接口返回值全部字段

目录 前言&#xff1a; 一、认识一下&#xff0c;DeepDiff 介绍 主要组成部分&#xff1a; 二、DeepDiff 使用 2.1 案例一&#xff1a;比较两个 JSON 2.2 案例二&#xff1a;比较接口响应 2.3 案例三&#xff1a;正则搜索匹配 三、最后一个小技巧&#xff1a;DeepDiff …