深入浅出快手图数据库:看架构如何让推荐召回更高效

1,122次阅读
没有评论

深入浅出快手图数据库:看架构如何让推荐召回更高效

深入浅出快手图数据库:看架构如何让推荐召回更高效

导读 本文将从工程的角度,分享快手图数据库存算分离架构及其在实时推荐召回的应用。

主要内容包括以下四大部分:

1. 应用场景

2. 核心诉求

3. 存算分离架构

4. 性能要点

分享嘉宾|李本利 快手 图数据库工程师 

编辑整理|李晓

内容校对|李瑶

出品社区|DataFun

01应⽤场景

1. 三角问题-扩散

首先来看一个图推荐中经常会遇到的场景,图扩散。

深入浅出快手图数据库:看架构如何让推荐召回更高效

如上图所示,已知一个点,由此点出发,找自己的行为关系,到达一个中间结点,再到另外一个结点,这样就是两跳。两跳之后获取全部数据,然后进行内容的推荐计算,比如我关注的人还关注谁、我关注的大  V 的朋友圈有哪些大 V、我点赞的视频相似度高的视频有哪些。其中朋友圈有很多定义方式,比如他们的互关、交互程度即亲密分数比较高、互动比较频繁,或者其它一些定义。

这种场景的特点是所见即所得。对简单规则推荐的业务场景来说,用语法上线速度是非常快的。

对于其他拓展场景,关系可以是多样化的,比如关注、互关、点赞、评论、分享,还有一些其它的关系比如 Facebook 好友等等。另一方面,节点也可以是多样的,包括用户、视频以及认证账号。这种推荐方式非常常见,可以取得很好的定向推荐效果。

深入浅出快手图数据库:看架构如何让推荐召回更高效

这种推荐方式可以用 Cypher 语法来描述,如上图所示,从一个点出发,经过一个边,再经过一个边,最终拿到一个点,对这个点来计数。当然这个计数只是一种方式,还有其它一些方法比如 sum(sim_score),计算出最终的 score 值,根据 score 值排序、截断,然后推荐。正常情况下,推荐的结果一般不会超过一千,但是中间访问到d的数据量是很大的,突破几十万都是很正常的。快手这边 Follow 上线目前是五千,其它边可以轻松达到几十万、上百万的数据量。

2. 三角问题-共同

再来看第二个场景,共同关注。

深入浅出快手图数据库:看架构如何让推荐召回更高效

已知两个点,来确定他们之间是不是存在一些关系,比如共同关注的关系、有共同的好友或是有共同的圈子。主要应用场景是,点开一个陌生的头像或是陌生的主页,为了诱使用户与其发生更进一步的关系,就会告诉他我们有共同的兴趣爱好,这属于点对点的推荐方式。

深入浅出快手图数据库:看架构如何让推荐召回更高效

为了解决这样的问题,采用共同类的方式,具体方法是分别从这两个点出发,最终拿到一个目标,共同的一个点,进行聚合 UNION ALL,得到一个聚合后的 COUNT 值。

为什么要用聚合的方式而不是用其他方式?我们在访问过程中,会有很多的筛选条件,比如要求过滤掉大 V 帐号、过滤掉已经封禁的帐号等等,筛选条件会比较丰富,可能还要根据最终节点拿到他的属性进行筛选,这样每两个跳都可以单独筛选,最终拿到这样的结果。

3. 存在问题

深入浅出快手图数据库:看架构如何让推荐召回更高效

存在问题,指的是我和群体有什么关系。比如博主发了一个视频,评论列表中有几十万,不可能每个评论都回复,这时就需要推荐出一些有价值的评论,进行回复,可能需要判断他们是不是朋友、是不是亲密度比较高,这样可以打上一些标签,博主就更可能会和其进行一些互动。

深入浅出快手图数据库:看架构如何让推荐召回更高效

对于这类需求,我们采用了内置的图算法,看是否存在一个这样的边,如果存在一个这样的边,就返回一个 ‘Follow’、‘FollowBy’、‘Friend’、‘Like’ 等关系,这些关系是根据用户的使用场景具体定义的,最终对边进行标签化的展示。

02

核心诉求

前文中讲到了三种场景,更多的情况是这三种场景的糅合,会比较复杂。用户的核心诉求为以下三点:

  • 成本:数据量超过千万级别,多种不同的边,总数据量可达到万亿级别,几百台机器满足简单的需求是不可接受的,因此成本是备受关注的一个点。
  • 性能
  • 易用

以上三点缺一不可。

03

存算分离架构

1. 整体架构

存算分离架构是近年来数据库领域非常火热的一个架构,其主要特点就是按需部署。CPU、Memory 和 Disk 是相互隔离开的,每一部分都可以单独扩容。这样就可以很方便地找到瓶颈所在,并单独对其进行扩容,从而降低成本。

深入浅出快手图数据库:看架构如何让推荐召回更高效

快手当前的架构主要是分为 Graph Service 层、Tree Service 层和 Storage 层。

Graph Service 层就是语法的执行层。

Tree Service 层是图的模型层,中间会有 Cache,主要提供 Memory 选项。

Storage 层是由 SSD 磁盘存储和 S3 冷存储多样存储组成,这一层进行了冷热分离。

正常的情况下,我们的成本主要集中在内存层,因为我们的图对内存的需要比较高。

2. BWTree Service

深入浅出快手图数据库:看架构如何让推荐召回更高效

BWTree
Service 是内存层,是图描述的一层,对其最主要的诉求就是强一致。因为图的模型有一些其他衍生出来的数据结构,比如唯一性索引,物化出来的 num neighbors、双关等,如果不能做到强一致,整个模型会存在一些问题。它主要是利用 Mem 和 SSD 作为 Cache。

先来看一下用户请求的处理过程,如上图中右侧所示。用户发起一个请求,加入到请求队列,用户所有请求都在一个队列中。Tree-writer 线程工作中,会把这些请求打包成一个 Log,commit 到 WAL-service,这是强一致性存储的一个外部存储平台。commit 成功就可以应用  Wal-diff 到内存中;如果 commit 冲突,即 WAL-service 已经有了这个 Log,就要把最新的 Log 拉回来应用到内存,再重新执行上述过程。这样就可以保证强一致。最后就是 Log 应用到内存中,并返回成功。这里的 flush 后台线程,执行的频率比较低,大概是几十分钟至一个小时才会把所有的数据 flush 一遍,速率取决于当前的脏页率,尽量降低对持久化存储的影响。Page 持久化存储会分为两层,一层是 SSD Cache,还有一层是 S3 存储,可以进一步降低成本。我们的 Wal-service 除了刚才提到的日志,还兼具选主的功能,即多副本的情况下进行选主。

3. 紧凑内存模型

深入浅出快手图数据库:看架构如何让推荐召回更高效

前文中提到,内存是成本的主要来源。我们的内存模型和操作系统是比较相似的。用 mmap 申请很大的三块内存,分别作为一/二/三级页表,和操作系统的页表是同一个概念,在紧凑的内存空间是没有任何浪费的。第三级页表,指向真实的数据。数据是用 malloc,因为我们希望页本身是可变大小的。实例内存比较满,就进行淘汰,从 page
records 左侧开始遍历,遇到 access_num 为 0 的页就可以淘汰,这个过程也和操作系统比较像,因此我们也是用的 CLOCK 淘汰算法。

4. 边模型

深入浅出快手图数据库:看架构如何让推荐召回更高效

前面讲解了树模型,但是树模型不能完整地描述边,边有四种树结构,分别是 Record Tree、Unique Index Tree、Num Neighbors Materialize Tree 和 Bidirectional
Materialize Tree。Record Tree 是记录树,Unique Index Tree 是索引树,关系链树是需要维护索引的。Num
Neighbors Materialize Tree 是邻居的物化视图,主要记录在一点有多少个邻居,有多少个评论树,多少个好友树。物化视图的更新主要是依据普通的树更新,根据主树来更新。Bidirectional Materialize Tree 是双关物化视图,根据出边和入边物化出一个双关列表。以上四种树可以根据用户配置来进行生成或不生成。

5. Snapshot 隔离性

深入浅出快手图数据库:看架构如何让推荐召回更高效

在实时读写情况下。需要做到读视图 snapshot 一致性,不能出现幻读和未提交读。每个页有多个版本,修改页则复制一份页数据,并产生新的版本号,多个版本的页都记录在 page record 中。访问请求携带一个版本号 n+1,就可以区分并访问期望的页,从而实现了隔离。

04

性能要点

1. Share Nothing

深入浅出快手图数据库:看架构如何让推荐召回更高效

比如一个两跳查询,一跳是 500,最终需要拉取 25 万数据。假如每跳是 5000,那么最终访问的数据就会有 2500 万。当然,2500 万数据的访问量级在实际使用中是不会出现的,我们都会进行限制,但即使限制到几十万的数据,对于经典的数据库也很难做到百毫秒以内返回,我们现在可以做到十万数据的查询计算 10 毫秒量级返回。性能是比较好的。那么我们是如何做到这样的性能的呢?

比较重要的做 Share
Nothing,这是数据库中一个比较经典的概念。用户的一个请求到了一个线程,这个线程有个协程,协程在发起请求的情况下使用线程绑定的连接池发起,不用再跨线程。因为跨线程是很耗时的,即使什么也不做也要时延大概 0.08 毫秒,如果多次跨线程总时延会达到 0.4 毫秒,对于线上的一些核心产品应用来说,和 Redis 对比,0.4 毫秒已经是比较高的延时了。Share Nothing 要求连接和本线程进行绑定,和 Tree Service 特定 worker 线程绑定,同样,在收到请求的情况下,也是在本线程执行,主要是读的过程,如果要发起到 S3 冷存储查询请求,或 KV 磁盘存储查询请求也都是在本线程。这就是 Share Nothing 的概念,尽量不要跨线程,数据也是在本线程完成的。

2. 数据流

深入浅出快手图数据库:看架构如何让推荐召回更高效

以上介绍了数据请求的过程,接下来看一下数据回传的过程。数据最终的叶子节点,存储格式是行存,但是在读之后就成为了列存格式。因为行存在更新时性能会比较好,列存时实时更新性能极差。因此,我们做了取舍,存储时用行存,读出之后所有数据用列存。读出之后的存数据格式,在经过 RPC 时,压缩效率和传输效率等都会比较高。最终到 Graph 层,数据经过一个个算子表达式。存数据作为算子的输入,可以做向量化的运算。最终拿到的输出也是列式进行输出,我们用的是 Apache-Arrow 数据存储格式返回给用户,也是列式存储。因此,这样的架构特别适合图查询和计算。

以上就是本次分享的内容,谢谢大家。

深入浅出快手图数据库:看架构如何让推荐召回更高效

深入浅出快手图数据库:看架构如何让推荐召回更高效

分享嘉宾

INTRODUCTION

深入浅出快手图数据库:看架构如何让推荐召回更高效

李本利

深入浅出快手图数据库:看架构如何让推荐召回更高效

快手

深入浅出快手图数据库:看架构如何让推荐召回更高效

图数据库工程师

深入浅出快手图数据库:看架构如何让推荐召回更高效

在滴滴,腾讯,快手从事多年数据库研发工作。近年来专注于图数据库内核研发,追求强一致,低成本,高性能,致力于满足用户更多使用场景

今日推荐

深入浅出快手图数据库:看架构如何让推荐召回更高效

往期推荐

小米数据开发平台架构实践

如何将知识图谱与AIGC结合?京东是这么做的

【他山之石】360 多兴趣召回 Mind 实战优化

B站大数据开发治理平台的产品设计心得

如何建设一个良好的可观测性数据平台直击企业痛点?

在大型项目中,抖音集团如何“用活”数据?

快手3D数字人直播互动解决方案-元宇宙的应用探索

蚂蚁 TuGraph-DB 数据库查询引擎技术

如何使用 JIT 技术实现高效的数据库表达式求值

Alluxio 在网易大数据的应用与优化实践

数据集成产品的技术演进与实际应用-FastData DCT

深入浅出快手图数据库:看架构如何让推荐召回更高效深入浅出快手图数据库:看架构如何让推荐召回更高效

点个在看你最好看

 

Read More 

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)

文心AIGC

2024 年 1 月
1234567
891011121314
15161718192021
22232425262728
293031  
文心AIGC
文心AIGC
人工智能ChatGPT,AIGC指利用人工智能技术来生成内容,其中包括文字、语音、代码、图像、视频、机器人动作等等。被认为是继PGC、UGC之后的新型内容创作方式。AIGC作为元宇宙的新方向,近几年迭代速度呈现指数级爆发,谷歌、Meta、百度等平台型巨头持续布局
文章搜索
热门文章
潞晨尤洋:日常办公没必要上私有模型,这三类企业才需要 | MEET2026

潞晨尤洋:日常办公没必要上私有模型,这三类企业才需要 | MEET2026

潞晨尤洋:日常办公没必要上私有模型,这三类企业才需要 | MEET2026 Jay 2025-12-22 09...
面向「空天具身智能」,北航团队提出星座规划新基准丨NeurIPS’25

面向「空天具身智能」,北航团队提出星座规划新基准丨NeurIPS’25

面向「空天具身智能」,北航团队提出星座规划新基准丨NeurIPS’25 鹭羽 2025-12-13 22:37...
钉钉又发新版本!把 AI 搬进每一次对话和会议

钉钉又发新版本!把 AI 搬进每一次对话和会议

钉钉又发新版本!把 AI 搬进每一次对话和会议 梦晨 2025-12-11 15:33:51 来源:量子位 A...
商汤Seko2.0重磅发布,合作短剧登顶抖音AI短剧榜No.1

商汤Seko2.0重磅发布,合作短剧登顶抖音AI短剧榜No.1

商汤Seko2.0重磅发布,合作短剧登顶抖音AI短剧榜No.1 十三 2025-12-15 14:13:14 ...
跳过“逐字生成”!蚂蚁集团赵俊博:扩散模型让我们能直接修改Token | MEET2026

跳过“逐字生成”!蚂蚁集团赵俊博:扩散模型让我们能直接修改Token | MEET2026

跳过“逐字生成”!蚂蚁集团赵俊博:扩散模型让我们能直接修改Token | MEET2026 一水 2025-1...
最新评论
ufabet ufabet มีเกมให้เลือกเล่นมากมาย: เกมเดิมพันหลากหลาย ครบทุกค่ายดัง
tornado crypto mixer tornado crypto mixer Discover the power of privacy with TornadoCash! Learn how this decentralized mixer ensures your transactions remain confidential.
ดูบอลสด ดูบอลสด Very well presented. Every quote was awesome and thanks for sharing the content. Keep sharing and keep motivating others.
ดูบอลสด ดูบอลสด Pretty! This has been a really wonderful post. Many thanks for providing these details.
ดูบอลสด ดูบอลสด Pretty! This has been a really wonderful post. Many thanks for providing these details.
ดูบอลสด ดูบอลสด Hi there to all, for the reason that I am genuinely keen of reading this website’s post to be updated on a regular basis. It carries pleasant stuff.
Obrazy Sztuka Nowoczesna Obrazy Sztuka Nowoczesna Thank you for this wonderful contribution to the topic. Your ability to explain complex ideas simply is admirable.
ufabet ufabet Hi there to all, for the reason that I am genuinely keen of reading this website’s post to be updated on a regular basis. It carries pleasant stuff.
ufabet ufabet You’re so awesome! I don’t believe I have read a single thing like that before. So great to find someone with some original thoughts on this topic. Really.. thank you for starting this up. This website is something that is needed on the internet, someone with a little originality!
ufabet ufabet Very well presented. Every quote was awesome and thanks for sharing the content. Keep sharing and keep motivating others.
热评文章
预见未来:96位前沿先锋超万字核心观点总结,抢抓未来产业新高地

预见未来:96位前沿先锋超万字核心观点总结,抢抓未来产业新高地

预见未来:96位前沿先锋超万字核心观点总结,抢抓未来产业新高地 henry 2025-12-11 10:27:...
Meta公开抄阿里Qwen作业,还闭源了…

Meta公开抄阿里Qwen作业,还闭源了…

Meta公开抄阿里Qwen作业,还闭源了… Jay 2025-12-11 11:48:25 来源:量子位 Ja...
MEET2026挤爆了,AI圈今年最该听的20+场演讲&对谈都在这

MEET2026挤爆了,AI圈今年最该听的20+场演讲&对谈都在这

MEET2026挤爆了,AI圈今年最该听的20+场演讲&对谈都在这 西风 2025-12-11 15:...
钉钉又发新版本!把 AI 搬进每一次对话和会议

钉钉又发新版本!把 AI 搬进每一次对话和会议

钉钉又发新版本!把 AI 搬进每一次对话和会议 梦晨 2025-12-11 15:33:51 来源:量子位 A...