首页 > 数据库 >图数据库基准测试 LDBC SNB 系列讲解:Schema 和数据生成的机制

图数据库基准测试 LDBC SNB 系列讲解:Schema 和数据生成的机制

时间:2024-03-12 12:23:22浏览次数:34  
标签:LDBC SNB Person 生成 DataGen 数据 Schema

LDBC(Linked Data Benchmark Council)Social Network Benchmark,简称 LDBC SNB,是一种针对社交网络场景的评估图数据库性能的基准测试。

LDBC 简介

除了 Social Network Benchmark,LDBC 旗下目前还有其他几种基准测试:Graphalytics Benchmark,Financial Benchmark 和 Semantic Publish Benchmark,分别针对图分析、金融和 RDF 的场景。Social Network Benchmark 是 LDBC 最早的提出的基准测试,已经成为国内外最主流的图数据库基准测试,在国内很多图数据库招标也会将 LDBC SNB 作为性能测试的一项。但需要说明的是,LDBC 本身作为一个非盈利组织,只提供官方审计。不同图数据库可能受到运行环境以及基准测试的相关参数影响,因此测试结果的横向对比没有任何意义

LDBC SNB 主要包括三个主要部分:

  1. Data Generator:这是一个数据生成工具,用于生成具有社交网络特性的大规模复杂数据。这些数据包括人、帖子、评论、地理位置、组织和其他一些社交网络的典型实体和关系。
  2. Interactive Workload:主要针对 OLTP,模拟了用户在社交网络上的日常活动,例如发布帖子、添加好友、点赞等。读请求以查询以一到两跳为主,同时可能会伴随一些写请求。
  3. Business Intelligence Workload:主要针对 OLAP,模拟了对社交网络数据进行深入分析,以全图查询为主。例如分析用户的社交行为、社区的形成和演变,以及其他一些需要复杂分析和大量数据处理的任务。

LDBC SNB 的论文里还提到了一个 SNB Algorithms,顾名思义主要是跑图算法的,如 PageRank、社区发现、广度搜索等。但论文是 2015 年发表的,当时描述这个场景还在起草中,目前已经将这部分移到了 Graphalytics Benchmark。

此外,想要运行 LDBC SNB 测试,还需要一个官方提供的 Driver。不同的数据库需要基于 Driver 的接口实现相应的 Connector,用来连接 Driver 和数据库。之后 Driver 会根据 Benchmark 的相关参数生成 Workload(这里可以理解为一系列的查询语句),并驱动待测数据库执行这些查询语句,最终得到性能测试结果。

整个 LDBC SNB 基准测试的流程如下,主要分成准备阶段基准测试结果输出这三个阶段。

准备阶段主要执行数据生成,包括初次导入的全量数据,以及后续实时更新的数据。此外在官方审计中,还需要在 SF10 Dataset 上进行 Validation,因此这一阶段也会生成用于校验的数据。

基准测试阶段会先在 SF10 Dataset(在本文文末介绍了何为 SF)上进行 Validation,之后会在 SF30 或者 SF100 Dataset 进行性能测试。Validation 的过程就是在数据导入之后,由 Driver 根据之前准备阶段的一系列 query 和期望结果,对数据库的查询结果进行校验,以确保数据库的查询结果正确。Validation 的这个过程没有时间要求。而之后的性能测试分为导入、预热、性能测试,数据库可以有 30 分钟的预热时间,而在性能测试至少要持续两个小时,最终将测试结果汇总并输出。

figure

由于篇幅限制,我们这一系列重点介绍 SNB Interactive Workload 相关内容。这一篇,我们主要会结合论文,介绍 SNB 的 Schema 以及数据生成,也就是准备阶段。

LDBC SNB Schema 生成

为了和 SNB 中的数据命名统一,本文相关名称我会用英文,所以读起来可能会有些怪怪的。为了降低理解成本,每个英文单词首次出现后面会跟随对应的中文注释讲解。

SNB 的数据主要是模拟了一个类似 Facebook 的社交网络。其中数据都是围绕 Person(人)构建而来,Person 之间会构成 Friendship(情谊)网络。每个 Person 可能会有若干 Forum(特定讨论区),Person 可以在 Forum 中下面发送若干 Post(帖子),其他 Person 可能会 likes(点赞)其中一些 Message(消息)。

以上这些元素的数据量主要会受 Person 和时间的影响:

  • 有更多朋友的人会发送更多的评论或点赞
  • 时间越长,会结交更多的朋友,评论或点赞数量也会上升

还有一部分数据不会随 Person 数量而变化,主要包括一些 Organization(组织,这里主要是学校)以及 Place(地方,这里主要是居住城市、国家等地理信息)。这部分数据会在数据生成时起一些作用,比如在同一时期在同一个学校上学的人更有可能称为朋友。

SNB 的完整 Schema 如下图所示:

figure

大多数图数据库在进行测试时候,会将实体建模为点,而不同关系会建模为边。但这只是一个惯例,SNB 的数据建模和实际数据库中的 Schema 可以不同,只要数据库能够完成相应 Workload 的查询即可

LDBC SNB 数据生成

SNB 的一个重要部分是 Data Generator(下文称为 DataGen),用来生成满足上面 Schema 的数据。Generator 生成的数据由以下三个参数决定:

  1. Person 的个数
  2. 模拟多少年的数据
  3. 从哪一年开始模拟

根据官方文档,DataGen 生成的数据有以下性质:

  • 现实性:生成数据模拟了一个真实的社交网络。一方面,生成数据中的属性、基数、数据相关性和分布经过精心设置,从而能够模拟 Facebook 等真实社交网络。另一方面,其原始数据来自于 DBpedia,保证数据中的属性值真实且相关。
  • 可扩展性:针对不同规模和预算的系统,DataGen 能够生成不同大小的数据集(GB 到 TB 级),此外 DataGen 可以在单机,或者是一个集群中完成数据生成。
  • 确定性:无论用来生成数据的机器数量多少、机器配置是高还是低,DataGen 生成的数据都是确定且相同的。这一重要功能确保了任意一个数据系统都能使用相同的数据集,保证不同系统环境之间的测评比较公平且基准测试结果可重复。
  • 易用性:DataGen 被设计得尽可能易于使用。

整个数据生成的流程图如下所示,我们会分解为几部分介绍:

figure

生成属性分布

第一步是初始化。DataGen 使用的原始数据来自于 DBpedia,针对每一个属性,DataGen 会根据以下方面决定属性的分布:

  • 有多少种可能的属性值
  • 每一种属性值出现的概率

最终将属性的分布情况作为资源文件以及 DataGen 的参数保存下来。

生成 Person 和 Friendship

前面也提到过,SNB 的 Schema 的核心是 Person,这也体现在数据生成过程中。接下来 DataGen 就会生成所有 Person,以及 Person 中一部分后续操作所需要的信息,比如每个 Person 有多少 Friendship(这个值非常重要,其分布满足 Power law(幂定律)),Person 所就读的大学,Person 所就职的公司等。

接下来,DataGen 会创建每个 PersonFriendship 关系(即流程图中的 knows)。和真实社交网络一样,有相同兴趣或者行为的人,很有可能会连接在一起。为了模拟这样的社交网络,SNB 在生成 Friendship 时会考虑以下三个维度:

  1. Person 所就读的大学,就读时间,以及大学所在城市
  2. Person 的兴趣
  3. 每个 Person 会生成一个随机值,随机值越相近代表其越类似(这是为了模拟不是所有朋友都是通过大学和兴趣结交的)

三个维度分别占每个 PersonFriendship关系权重的 45%,45% 和 10%,也就将 Person 之间建边的过程分成了三个子步骤。

DataGen 会依次根据三个维度将所有 Person 进行排序(每次只按一个维度进行排序),然后将排序过后的 Person 切分为不相交的多个部分,分发给不同 Worker 进程。即便是切分之后,每个 Worker 线程负责的 Person 可能也可能超过内存大小。因此,Worker 线程会维护一个滑动窗口,滑动窗口内的 Person 之间建立 Friendship 关系的概率满足几何分布。

如下图所示:

figure

假设现在根据就读大学这个维度进行了排序,得到了一个 Person 有序序列。之后 Worker 就会维护一个滑动窗口,每次为滑动窗口最左侧的人生成 Friendship 关系(上图当前是 P2),滑动窗口内的其他人和窗口第一个人建立 Friendship 的比例满足几何分布。

直到滑动窗口的第一个人建立了足够多的 Friendship 之后,滑动窗口的起点会移到下一个人。

这里没有深究滑动窗口的大小、几何分布的参数甚至是随机生成器的参数,不知道在出现滑动窗口内无法生成足够多 Friendship 关系时,DataGen 如何处理。

将三个维度都经过排序、分发、按滑动窗口建边之后,DataGen 就进入了下一阶段。

生成社交活动

生成完 PersonFriendship 之后,DataGen 就开始生成每个 Person 的社交活动,包括 ForumPostComment。这部分数据也有一些相关性存在:

  1. 有越多 FriendshipPerson 在社交网络上会越活跃
  2. 每个 Person 更可能在自己感兴趣或者就读大学相关的 Forum 进行 Post 或者 Comment
  3. 社交活动和时间是有相关性的,比如接近世界杯,足球相关的讨论就会激增

最终输出

经过以上步骤之后,DataGen 完成了数据生成,模拟的社交网络图会分成两部分进行输出:

  • Dataset:90% 的数据用于初始导入
  • Update Streams:10% 的数据用于后续实时更新

除此之外,还会生成后续 Workload 中请求的参数(主要是起点)。关于参数生成我们会在下一篇详细解释,这里简单描述一下 SNB 的读请求 Workload。Interactive Workload 主要的查询希望在一秒以内得到查询结果,所有读 query 都是从图中的一个点出发,获取很小一部分的子图信息。另外,因不同起点的出入度不同,基本上也就决定了这次读请求会访问的数据量。

为了测试不同系统和场景,SNB 定义了比例因子(Scale Factor,即所谓的 SF)用来控制最终生成的数据量大小。比如,SF1 原始数据大小为 1 GB,同理 SF0.1 和 SF300 的大小为 100 MB 和 300 GB。不同比例因子的各个类型的点边数据量如下表所示:

figure

最终生成的 Dataset 分为两大类:Static 和 Dynamic,格式都是 CSV。根据 DataGen 配置的线程数量大小,最终生成的数据也会分为多个分片。Static 包含 OrganizationPlaceTag 等,都是基于 DBpedia 生成的静态数据,其数量不会随着比例因子变化而变化。换而言之,这部分数据与 Person 的个数无关。而 Dynamic 部分主要包括 Personknows(即前面数据生成部分描述的 Friendship)、ForumPostComment 等。

而 Update Streams 中包含了所有更新的操作,主要就是模拟实时注册新用户、评论、点赞、加好友等等行为。

Reference

到这里准备阶段大概就介绍完了,在准备阶段最终生成的请求参数部分我们会在下一篇讲述Workload时再展开。

关于 NebulaGraph
NebulaGraph 是一款开源的分布式图数据库,自 2019 年开源以来,先后被美团、京东、360 数科、快手、众安金融等多家企业采用,应用在智能推荐、金融风控、数据治理、知识图谱等等应用场景。GitHub 地址:https://github.com/vesoft-inc/nebula

作者:critical27

标签:LDBC,SNB,Person,生成,DataGen,数据,Schema
From: https://www.cnblogs.com/nebulagraph/p/18068034

相关文章

  • Python中Spark读取parquet文件并获取schema的JSON表示
     步骤:初始化SparkSession。使用spark.read.parquet()读取Parquet文件。调用df.schema.json()获取schema的JSON表示。frompyspark.sqlimportSparkSession#初始化SparkSessionspark=SparkSession.builder.appName("ReadParquetSchema").getOrCreate(......
  • dremio 的InformationSchemaCatalog 服务三
    以前简单写过一些关于dremio的InformationSchemaCatalog,也说过dremio为了方便提供标准的INFORMATION_SCHEMA自己开发了存储扩展,以下是关于存储扩展的创建以及刷新说明创建创建是在CatalogService中处理的,具体的实现是CatalogServiceImpl参考处理if(roles.conta......
  • 摆脱复杂图谱术语,7个原则搞定Schema建模
    前言在OpenSPG最新发布的0.0.2版本中,为了方便大家更好地理解和应用OpenSPG构建知识图谱,发布了知识建模最佳实践的7个指导原则。本文我们结合蚂蚁域内的多个业务场景,举例说明结合SPG规范的结构与语义解耦的知识建模及schema设计方法。OpenSPGGitHub:https://github.com/OpenSPG/o......
  • Json Schema介绍 和 .net 下的实践 - 基于Lateapexearlyspeed.Json.Schema - 基础1 -
    本系列旨在介绍JsonSchema的常见用法,以及.net实现库Lateapexearlyspeed.Json.Schema的使用这篇文章将介绍JsonSchema中的type关键字,和string类型的常见验证功能。用例基于.net的LateApexEarlySpeed.Json.Schemanugetpackage。这是新创建的一个JsonSchema在.net下的高性能......
  • Schema “public“ has version 1.0.0, but no migration could be resolved in the c
    该错误信息是由Flyway报告的,指出在应用程序的数据库迁移过程中遇到了问题。Flyway是一种流行的数据库迁移工具,用于版本控制数据库模式的变化。具体来说,错误信息Schema"public"hasversion1.0.0,butnomigrationcouldberesolvedintheconfiguredlocations!表明以下......
  • 基于macro 仿写一个简单的ecto schema dsl
    ecto的schemamacro是一个很方便的功能,可以用来定义表的schema信息,以下是一个简单的仿写(只是行像,但是功能不一样)项目代码macro定义e.ex defmoduleEdo#方便use使用defmacro__using__(_options)doquotedoimportE#通过属性存储信息M......
  • 08-Informatica_schema获取元数据
    数据库的元数据即数据库对象的数据,如表,库,的属性数据等,存放在informatica——schema数据库中,已虚拟表的形式存在,只能读不能写一、获取元数据的方法查询INFORMATION_SCHEMA数据库表。其中包含MySQL数据库服务器所管理的所有对象的相关数据使用SHOW语句。用于获取数据库......
  • vs 使用 jsonschema
    使用jsonschema限制json配置文件内容vs配置文件中,添加\(schema,映射对应的json文件,此文件可以根据现有json文件通过工具生成基础的内容"\)schema":"http://127.0.0.1/webapibase.json",jsonschema文档https://json-schema.apifox.cn/工具https://hellosean1025.gith......
  • MySql的information_schema.processlist库学习之"如何检测出大数据sql查询"
    1.如何通过MySql检测出大数据sql查询一般数据库都会存在:information_schema数据库 检测出大数据sql查询[time时间越长说明,数据量越大,要根据公司的限度来衡量,我的思路是500以上都要查看是否是大数据的范畴]2.案例--检测出大数据sql查询[time时间越长说明,数据量越大,要根据......
  • Json Schema简介和Json Schema的.net实现库 LateApexEarlySpeed.Json.Schema
    什么是JsonSchema?JsonSchema是一种声明式语言,它可以用来标识Json的结构,数据类型和数据的具体限制,它提供了描述期望Json结构的标准化方法。利用JsonSchema,你可以定义Json结构的各种规则,以便确定Json数据在各个子系统中交互传输时保持兼容和一致的格式。一般来说,系统可以自......