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

论文导读 | 支持事务与图分析的图存储系统

事务系统保证了系统的数据一致性,确保事务更新的原子性或是不同事务之间的数据隔离性等在多线程并发环境下所必不可少的ACID特性。而在今天快速变化的商业环境下,诸如物流和供应链,金融风控和欺诈检测等场景都需要图分析系统提供对数据动态更新和新鲜度的更高要求。因此,在图分析系统中支持事务机制至关重要。本文将介绍三篇相关论文Livegraph,Teseo与Sortledton。

图片

图片

图片

背景介绍

图分析系统通常存储下图的拓扑结构以及必要的属性,并支持在存储图上高效执行各类图算法,例如单源最短路(Single source shortest path,SSSP)和PageRank(PR)算法。在大多数原生的图存储系统中,拓扑结构通常采用下图所示的两种方法:1.稀疏矩阵行压缩(compressed sparse row,CSR),2.邻接表。

图片

CSR通过将所有顶点的所有邻域共同存储连续的内存位置,形成一个紧凑的结构,支持快速的读取,但需要承担高额的修改代价。邻接表的各个顶点邻域分别存储,读取上由于邻域不存储在一起需要若干次指针查找会逊色于CSR结构。

事务方面,目前的主流系统都采取的多版本并发控制(multiple version concurrency control,MVCC)来实现。MVCC的主要思想是存储数据的多个版本,记录这些版本创建和无效的时间戳。而各个事务可以根据自己的时间戳读取自己需要的版本数据,以此避免读写冲突。根据不同时间戳限制可以轻松实现读已提交、快照隔离等不同隔离等级,并可以引入经典的两阶段锁策略实现可串行化隔离等级。

本文介绍的三篇论文旨在将图分析与事务两种操作结合在一个图存储系统中从而实现高效且支持并发的图分析操作。他们在事务方面皆采用了MVCC方案,并分别构建了自己的图存储数据结构。

设计思路

本部分将介绍三篇论文的数据结构的设计思路。

LiveGraph:

图分析的基本操作是大量的邻接表扫描,包含一次查找顶点邻域的seek和一次扫描邻域的scan两种操作。目前的主流图存储结构中,通常分为以neo4j为代表的链表形式、为了适应磁盘交换数据而设计的LSM-Tree(Log Structured Merge Tree)和B+Tree及上文描述过的CSR形式。这些结构在两类操作(seek和scan)上的效率各不相同。CSR以更新代价为代价达到最好的性能。

图片

这之中,LiveGraph提出的新数据结构:事务型边日志(TEL)在连续TEL在连续内存上结合多版本,能够达到类似CSR的常数级seek并支持连续扫描邻域。下表也能够体现TEL相对于LSMT、B+Tree和链表的优势。

图片

Teseo:

在LiveGraph的基础上,Teseo认为不仅要考虑某个点邻域的寻址与扫描问题,也要考虑扫描不同邻域时的时间消耗。Teseo总结图分析算法如下图,认为扫描所有邻域的图分析算法有两类:一是顺序扫描所有邻域,二是随机访问所有邻域。前者典型如PageRank,后者典型如SSSP。而类似LiveGraph这种邻接表的形式无法很好处理不同邻域的扫描。

图片

Sortledton:

Sortledton设计了相关的实验,将同一个顶点的邻域存储在块大小超过256的链状块结构即可达到与存储在连续内存空间相近的效率。同时,Teseo中针对扫描所有顶点邻域的优化并不是必要的。最后,Sortledton总结了包括LiveGraph和Teseo在内的多个动态图分析结构,认为动态图结合事务系统需要提供三类操作:支持并发的事务操作,用于图分析的扫描操作和用于图模式匹配的快速交集(要求数据结构有序)操作。

图片

数据结构与事务机制

本部分介绍三篇论文具体的数据结构与事务机制设计。

LiveGraph

图片

上图展示了LiveGraph数据结构的基本布局。LiveGraph基于属性图建模,每条边具有多种属性,并且有且仅有一个标签(Label)。点的相关信息都存储在Vertex Block(VB)里,而同一个点的同一类标签的出边都存放在一个TEL结构里。LiveGraph利用全局的点和边索引来快速定位需要操作的VB和TEL。

TEL内部的结构如下图所示,除了开头固定长度的元数据外,相关边与对应属性在一个倍增的动态扩容数组中分别从两头往中间增长。最新的数据被存储在最中间。这种布局保证了扫描一个邻域时是顺序访问内存的。此外,LiveGraph在基础数据结构中就实现了多版本存储:每个边在被删除或更新时,并不是直接在动态数组中删除该边及属性,而是修改该边的无效时间戳Invalidation TS,存储下这条边的历史数据。

为了支持这种多版本的存储,新边的插入操作不需要改变,但原有边的更新操作需要修改旧版本的无效时间戳。为了快速判断边操作是插入还是更新,LiveGraph在每个TEL的元数据出添加了一个Bloom filter加速判断。由于TEL的边是按照时间顺序存储的,因此单边查询可能需要scan整个TEL结构。

图片

事务方面,LiveGraph实现了快照隔离。在全局有一个主线程管理事务,各个分线程执行事务,同时存在一个全局读时间戳GRE与写时间戳GWE。每个顶点拥有一个futex,在快照隔离下读写操作不互斥,事务的写操作在提交前不会被其他事务所读取,而写写操作则通过锁进行互斥。每个TEL额外维护一个最新提交时间CT与日志大小LS并在事务提交时更新,日志大小LS可以防止其他线程读取到未提交的数据。为了防止死锁,LiveGraph将超时的事务进行回滚,并使用批量提交的方法提高吞吐率。

具体而言,读写事务的操作分为以下三个阶段:

1.事务开启:事务读时间戳TRE设为GRE,写操作获取写锁后,更新私人版本。该私人版本由于日志大小LS未更新因此不会被读取。

2.事务持久化:事务提交前,交由主线程执行组提交。主线程令GWE+1。将日志同步到磁盘后。通知各线程执行提交。

3.事务提交:修改CT与LS。释放写锁。修改日志时间戳。组提交完成后,通知主线程令GRE+1,使事务可见。

Teseo

首先介绍Teseo使用的数据结构之一PMA。

图片

如上图所示,PMA是带有空隙的数组,将之分成若干segment。插入时优先插入segment中的空隙,若segment满时则联合周围若干segment执行rebalance,元素过多时可能执行数组的倍增。每次更新的最差效率为O(logN)^2,均匀分布的均摊效率是O(logN)。参数的设置可以保证rebalance段的填充率约为75%,而整体数组的填充率为50%。

图片

Teseo的设计灵感从B+Tree出发。B+Tree的问题在于:B+tree的叶子较小(4KB),大度数的邻域scan将频繁跨越叶子。并且小度数的邻域scan将近似对数效率的点查找。因此Teseo提出了Fat-tree,如上图所示:1. 增大叶子大小至MB级别 2. 添加hash map作为secondary index加速点查找。

但简单地扩大叶子会提高更新的代价。因此Teseo将叶子的数据结构组织为稀疏数组。每个Segment具有一对fence key;叶子节点以min key为键,构建ART索引方便快速查找叶子。当稀疏数组需要expand时,执行split,保证叶子大小在X/2~X之间。删除时不执行rebalance,而是在必要时进行叶子间的merge。

Teseo将segment分为读优化段ROS和写优化段WOS,如下图所示。初始段模式为ROS,在segment的两边存储数据。插入时需要挪动数据。为了防止更新偏斜的最差情况,段满时以延迟D执行rebalance。为此需要一个机制存储多余的数据:WOS段模式。WOS段模式利用段外的buffer和段内的索引存储数据,数据为<src,dst>,索引为ART tree。

图片

为了支持事务的并发,每个segment具有一个hybrid latch。携带一个版本标记的读写锁,读数据时乐观地可以选择不加读锁,而通过对比版本确保无人修改数据。为了防止死锁,Teseo的只读事务会获得传统的读锁存器。而读写事务的读操作则只能获取乐观模式的锁存器。由于Fat-Tree需要执行若干叶子中segment的rebalance,需要计算segment的长度。因此叶子节点还需要添加一个锁存器。二级索引使用的哈希表使用了无锁实现,同样可以保证线程安全。同时,在每个存储数组后面添加一个版本区域,以版本链的形式将数据的所有版本串联在一起,如下图所示。Teseo的事务执行逻辑基本与Hyper类似。

图片

Sortledton

图片

由于不需要优化所有邻域的访问模式,Sortledton采取邻接表的形式,以简化结构。如背景介绍中描述的,邻接表主要分为两个部分:点到边集的映射与某个点的邻边有序集。Sortledton的点边映射采用的两级数据如上图所示,第一级存储第二级数组的指针,每次扩容时新增一个大小翻倍的第二级数组。

而邻边有序集方面,根据设计思想一节中介绍的指导思想,不需要将邻边有序集都存储在连续物理内存,可以用块大小较大的链式块达到近似的处理速度。因此Sortledton选择松散链表,支持对数级别的查询更新的同时,维护边的有序性并避免类似B+ Tree的rebalance操作。

为了实现多版本存储,Sortledton在每个边维护的信息中加入一个版本链指针,并实现了一个传统的版本链维护。Sortledton的整体存储架构如下图所示,包括一个二级数组实现的动态索引,基于松散链表存储的每个点邻域与对应的版本链存储。

图片

事务方面,Sortledton专注于优化具有已知读写集的读写事务和只读事务,认为这两种类型是图分析事务中最主要的事务。针对具有已知读写集的读写事务而言,事务的操作按照顺序主要分为:由于写集已知,因此可以先获取所有对应数据的锁,之后读取最新版本数据。最后获取commit时间戳,并在完成写操作后释放锁。而针对只读事务,则先获取read时间戳,并在需要读取数据时加读锁,读取数据后释放读锁。

实验

由于Sortledton的实验对比对象包括LiveGraph和Teseo,因此本文直接介绍Sortledton进行的实验。本实验采用的数据集是由LDBC数据生成器生成的图数据。

第一部分的测试比较插入的性能,对比的对象分别为Teseo,LiveGraph,GraphOne,Llama以及Stringer。插入的同时要求先查询该边是否存在。下图中存在巨大性能差异时主要由于存在性检测导致的:Teseo和Sortledton的边集有序,因此可以快速查询存在性;GraphOne不支持存在性查询。因此它们与另外三个系统存在较大的性能差异。

图片

第二部分的实验是针对图算法的实验,主要比较的图算法包括局部集聚系数LCC、单源最短路SSSP、广度优先搜索BFS、弱连通分量WCC、基于标签传播的社区检测CDLP和PageRank。并且以CSR作为baseline。可以看出Teseo和Sortledton在各算法表现中较好,其中Sortledton更胜一筹。值得注意的是,LCC由于需要执行交集操作,只有维护有序集的Teseo和Sortledton才能在有效时间内执行。

图片

第三部分的实验是针对事务系统的实验,因此只有对支持事务的Teseo和LiveGraph系统的对比,其中Teseo由于在Sortledton进行实验期间存在bug,因此只有与LiveGraph的对比。可以看出,在线程数较少时,Sortledton的性比对LiveGraph有较大的优势,与第二部分的实验一致。但线程数较多时,两者在PR上的性能差距不大。这是因为LiveGraph的多版本是顺序存储的,而Sortledton需要遵循版本链,存在不连续的内存空间。

图片

总结

本文介绍的三个系统在使用类CSR结构或邻接表的情况下,LiveGraph、Teseo、Sortledton有效的融合了事务系统和图分析系统,做到支持并发动态图分析。三篇论文为我们提供了设计针对图分析有效的数据结构,并设计了配套的事务系统的思路。

图片

图片

欢迎关注北京大学王选计算机研究所数据管理实验室微信公众号“图谱学苑“
实验室官网:https://mod.wict.pku.edu.cn/
微信社区群:请回复“社区”获取

实验室开源产品图数据库gStore:
gStore官网:https://www.gstore.cn/
GitHub:https://github.com/pkumod/gStore
Gitee:https://gitee.com/PKUMOD/gStore

图片

相关文章:

论文导读 | 支持事务与图分析的图存储系统

事务系统保证了系统的数据一致性&#xff0c;确保事务更新的原子性或是不同事务之间的数据隔离性等在多线程并发环境下所必不可少的ACID特性。而在今天快速变化的商业环境下&#xff0c;诸如物流和供应链&#xff0c;金融风控和欺诈检测等场景都需要图分析系统提供对数据动态更…...

Vue3最佳实践 第八章 ESLint 与 测试 ( ESLint )

ESLint ​在所有的JavaScript 项目开发中我们都会接触到 ESLint 这个词&#xff0c;ESLint 是个什么样的组件会给为项目做些什么吗&#xff1f;ESLint 是一种检查语法错误以及代码是否按照预定规则编写的工具。ESLint 可以帮助开发者发现代码中潜在的错误。在Vue项目中Eslint一…...

【C++】命名空间和using namespace std的注意事项

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …...

修改51单片机中数组元素的值

在8051单片机中&#xff0c;code关键字用于将数据存储在ROM中。由于ROM是只读的&#xff0c;所以在运行时无法直接修改seven_seg数组中的值。 如果您想在main函数中修改seven_seg[1]的值为0xc0&#xff0c;您可以将seven_seg数组定义为可写的变量&#xff0c;而不是存储在ROM中…...

Ruby和面向对象技术

Ruby和许多极为流行的编程语言都是面向对象的。多数的面向对象编程语言&#xff0c;每个对象都是一个样例或者既定类的实例以及独立对象的行为。 一、创建一个通用对象 创建一个通用对象 obj Object.new定义通用对象的行为 def obj.talk puts "I am an object"p…...

C++11常用新特性——可变参数模板

可变参数模板 C11中&#xff0c;可变参数模板是一个非常强大的特性&#xff0c;它允许函数和类模板接受任意数量和类型的参数&#xff0c;这为类型的安全编程提供了更广泛的灵活性。下面我将详细介绍这一新特性。 基础概念&#xff1a; 可变参数模板允许你传递多个类型和数量…...

SpringCloud-Seata

一、介绍 &#xff08;1&#xff09;实现分布式事务 &#xff08;2&#xff09;解决Spring只支持单机事务 &#xff08;3&#xff09;事务ID TC&#xff08;事务协调者&#xff09; TM&#xff08;事务管理者&#xff09; RM&#xff08;资源管理者&#xff09;...

java击球小游戏运行代码

创建一个图形化的小游戏通常需要使用Java图形库&#xff0c;例如Swing或JavaFX。下面是一个使用JavaFX创建的简单的图形化小游戏示例&#xff0c;其中一个小球会在窗口内移动&#xff0c;你需要点击小球以增加得分&#xff1a; import javafx.application.Application; import…...

Hadoop面试题+详解

20道面试题及详细解答&#xff01; 1.说说什么是结构化数据、非结构化数据和半结构化数据 结构化数据、非结构化数据和半结构化数据是根据数据的组织结构和格式来划分的不同类型的数据。 结构化数据&#xff1a;结构化数据是按照预定义的数据模型进行组织和存储的数据。它通常…...

PDF编辑阅读:Acrobat Pro DC 2021中文稳定版

Acrobat Pro DC 2021是一款专业的PDF编辑和阅读软件。它可以创建、编辑、组合、签署和分享PDF文件&#xff0c;提供了许多强大的功能&#xff0c;如PDF文件转换、OCR识别、PDF文件合并、加密和解密等等。Acrobat Pro DC 2021的界面简单直观&#xff0c;易于使用&#xff0c;而且…...

单词规律(C++解法)

题目 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 示例1: 输入: pattern "abba", s …...

MySQL 主从复制原理

文章目录 1.主从复制方式1.1 异步复制1.2 半同步复制1.3 全同步复制 2.主从复制原理3.主从复制时推还是拉&#xff1f;参考文献 主从复制是 MySQL 高可用&#xff08;备份&#xff09;和高性能&#xff08;读写分离&#xff09;的基础&#xff0c;有了这个基础&#xff0c;MySQ…...

构建嵌入式Linux rootfs根文件系统

创建根文件系统涉及选择系统运行所需的文件。在本节中&#xff0c;我们将介绍如何构建压缩的根文件系统。不太常见的选择是在直接作为 root 挂载的本地驱动器上构建未压缩的文件系统。 转载请注明来源&#xff0c;谢谢。构建嵌入式Linux rootfs根文件系统-CSDN博客创建根文件系…...

高速电路设计----第三章

一、数字信号需要上拉的情况 1、 一般信号上拉接多大的电阻要看对于芯片的电流要求。看芯片datasheet的I(BHLO)和I&#xff08;BHHO&#xff09;两个参数。平时的话: 3.3V的上拉为1K~3.3k即可 5V的上拉电阻为4.7K到10K即可。 2、数字信号的逻辑控制&a…...

【微信小程序】6天精准入门(第4天:自定义组件及案例界面)附源码

一、自定义组件 1、介绍 从小程序基础库版本 1.6.3 开始&#xff0c;小程序支持简洁的组件化编程。所有自定义组件相关特性都需要基础库版本 1.6.3 或更高。 开发者可以将页面内的功能模块抽象成自定义组件&#xff0c;以便在不同的页面中重复使用&#xff1b;也可以将复杂的页…...

pragma once与ifndef的区别

概要 代码编译过程中&#xff0c;为了防止同一份代码被重复引用&#xff0c;通常有两种实现方式 方式一 #pragma once 方式二 #ifndef _TEST_H_ #define _TEST_H_ #endif // !TEST_H 通常情况下&#xff0c;使用上述两种方式中的任意一种都是可以的。最近工作中&#xff0c;代…...

52单片机独立键盘控制数码管计数

前言 使用52单片机实现独立键盘控制数码管计数 代码 #include<reg52.h> #define uchar unsigned char #define uint unsigned intsbit key2 P3^4; sbit key3 P3^5; sbit key4 P3^6; sbit key5 P3^7;char code smg[] {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x…...

完美解决 在将最终稿件上传到 IEEE PDF eXpress进行格式检查是出现“font not embedded“的问题 (不会出现自动压缩图像的现象)

最近中了一篇IEEE的论文&#xff0c;在校稿阶段&#xff0c;final paper是需要通过IEEE PDF eXpress网站的格式检查&#xff0c;然后出现一下问题&#xff1a; Errors: Font TimesNewRomanPS-BoldMT, TimesNewRomanPS-ItalicMT, TimesNewRomanPSMT is not embedded 用人话说就…...

零基础学习CSS

01-CSS初体验 层叠样式表 (Cascading Style Sheets&#xff0c;缩写为 CSS&#xff09;&#xff0c;是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现&#xff08;美化内容&#xff09;。 书写位置&#xff1a;title 标签下方添加 style 双标签&#xff0c;style 标签…...

基于Flume+Kafka+Hbase+Flink+FineBI的实时综合案例(五)FineBI可视化

文章目录 22&#xff1a;FineBI配置数据集23&#xff1a;FineBI构建报表24&#xff1a;FineBI实时配置测试附录二&#xff1a;离线消费者完整代码 22&#xff1a;FineBI配置数据集 目标&#xff1a;实现FineBI访问MySQL结果数据集的配置 实施 安装FineBI 参考《FineBI Windows…...

Python逆向爬虫案例: 某网站AES逆向解密

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.8 Pycharm &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了&#xff0…...

ONNX runtime本地终端部署

1、class_index.csv文件&#xff1a; ID,English,Chinese 0,A,你 1,B,我 2,C,他 3,D,她2、classification.onnx 3、单张图像处理代码如下&#xff1a; import onnxruntime import torch import torch.nn.functional as F import pandas as pd from PIL import Image from tor…...

Linux性能优化--性能工具:特定进程CPU

4.0 概述 在用系统级性能工具找出是哪个进程降低了系统速度之后&#xff0c;你需要用特定进程性能工具来发现这个进程的行为。对此&#xff0c;Linux提供了丰富的工具用于追踪一个进程和应用程序性能的重要统计信息。 阅读本章后&#xff0c;你将能够&#xff1a; 确定应用程…...

技术人员转岗产品经理,有优势吗?

产品经理是一个非技术型的岗位&#xff0c;但是懂一些技术相关的知识会更好的和技术部门沟通&#xff0c;能更好的从技术部门的角度理解需求的可行性。所以这么说来&#xff0c;技术转产品经理相对来说更加有优势。 任何事情不可能都是只有好处没有坏处的&#xff0c;同样的&a…...

使用IDEA2022.1创建Maven工程出现卡死问题

使用IDEA创建Maven工程出现卡死问题&#xff0c;这个是一个bug 这里是别人和官方提供这个bug,大家可以参考一下 话不多说&#xff0c;上教程 解决方案&#xff1a; 方案1&#xff1a;更新idea版本 方案2&#xff1a;关闭工程&#xff0c;再新建&#xff0c;看图...

Nuttx Syscall

在Nuttx系统中&#xff0c;mksyscall工具用于根据syscall/syscall.csv文件生成供用户调用的接口和内核中对应的接口。具体来说&#xff0c;mksyscall -p system.csv生成供用户调用的接口&#xff0c;而mksyscall -s system.csv生成内核中调用的接口。 在syscall/syscall.csv文…...

HTTP协议中GET请求和POST请求的区别

1. 形式上&#xff1a; GET请求&#xff1a;参数包含在URL中&#xff0c;意味着参数的长度是有限的&#xff0c;并且参数只能是ASCII码的形式。 POST请求&#xff1a;参数包含在请求体中&#xff0c;参数的长度是不受限&#xff0c;并且参数支持多种数据类型。 2.安全性 GET请…...

【广州华锐互动】利用VR开展施工现场安全培训,提高员工安全意识水平

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐渗透到各个领域&#xff0c;为我们带来了前所未有的沉浸式体验。在建筑施工行业&#xff0c;VR技术的应用也日益广泛&#xff0c;从设计、施工到管理&#xff0c;都可以看到VR技术的身影。而在这…...

Cornerstone for Mac:高效SVN管理的黄金标准

在当今的软件开发领域&#xff0c;版本控制系统是不可或缺的一部分。其中&#xff0c;Subversion&#xff08;SVN&#xff09;是一个广泛使用的版本控制系统&#xff0c;有助于团队协同工作&#xff0c;实现代码的版本管理和追踪。对于Mac用户来说&#xff0c;Cornerstone是一款…...

数据结构之顺序表的模拟实现

&#x1f495;"世事犹如书籍&#xff0c;一页页被翻过去。人要向前看&#xff0c;少翻历史旧账。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;数据结构之顺序表的模拟实现 /*** Created with IntelliJ IDEA.* Description:* User: 绿字* Date:…...