带你认识图数据库性能和场景测试利器 LDBC SNB

本文分享自华为云社区《【图数据库性能和场景测试利器LDBC SNB】系列一:数据生成器简介 & 应用于GES服务》,作者:闹闹与球球
本文的主要内容包括:基于交互式查询所用的数据生成器(下文简称 Datagen)介绍,及 LDBC SNB 数据如何在华为图引擎服务 GES 中应用。LDBC SNB 所预设的节点和关系、数据生成器和系统的测试用例,形成了一个逻辑自恰的数据“武林”,以 ldbc snb 为测试标准的图数据库产品,就像是行走于其中的侠客们,都得遵循同一套“武林规矩”(测试用例),究竟谁能击败各方高手,问鼎盟主呢?
LDBC SNB 概述
LDBC SNB,全称链接数据基准委员会的社交网络基准,官网地址:http://ldbcouncil.org。LDBC 是一个致力于发展图数据管理的产业联盟组织,它开发了一套标准的 benchmarks,用于系统地衡量不同图数据库产品的功能和性能。SNB 是基于社交网络场景开发的一组 benchmarks,由交互式场景(Interactive workload)和商业智能场景(Business Intelligence workload)组成。
LDBC SNB 项目包括 3 个组件:数据生成器(Datagen)、测试驱动程序(Test Driver,用于执行 Benchmark 的测试)和测试用例实现(Reference Implementation,目前提供了基于 Cypher(Neo4j)和 SQL(PostgreSQL)两种查询语言的测试用例实现)
LDBC SNB 有两种工作模式:
1、交互式查询(Interactive workload),适用于事务性的在线查询场景,比如基础的增删改查、shortestpath、多跳等;
2、商业智能 (Business Intelligence workload),适用于根据企业业务场景制定的复杂查询和大规模离线图分析等场景。
在不同的工作模式下,【Datagen】、【Test Driver】 和【测试用例实现】都是不同的。
章节概览
一、Datagen 介绍
数据模型
数据类型
数据架构 Datagen 的安装和运行流程
Datagen 的参数设置
常规参数设置
规模因子
序列化模式
二、LDBC SNB 在 GES 中的应用
一、Datagen 介绍
数据模型
数据类型
Datagen 支持的属性 datatype 如下, 每种属性都支持单值和列表两种模式。

(截图来源于官方文档 http://ldbcouncil.org/ldbc_snb_docs/ldbc-snb-specification.pdf)
数据架构

(截图来源于官方文档 http://ldbcouncil.org/ldbc_snb_docs/ldbc-snb-specification.pdf)
如图所示,Datagen 生成的数据有预设的一套图模型,包括:
8 种节点:Organization & Place & tag & tagClass & Person & Forum & Post & Comment
15 种关系,如下表:

这些预设的节点和关系,形成了一个逻辑自恰的数据"武林",以 ldbc snb 为测试标准的图数据库产品,就像是行走于其中的侠客们,都得遵循同一套"武林规矩"(测试用例),究竟谁能击败各方高手,问鼎盟主呢?且拭目以待吧。
安装和运行流程
在 Interactive Workload 模式下,Datagen 的底座为 hadoop;在 BI Workload 模式下,底座为 Spark。
本次调研主要使用基于伪分布式 hadoop 的 Datagen。
1)下载基于 hadoop 的 ldbc datagenhttps://github.com/ldbc/ldbc_snb_datagen_hadoop
2)使用伪分布式的 hadoop
3)编译时出现缺失的 jar 包问题解决(报错如下)

解决方案:
从 windows 环境下载 https://simulation.tudelft.nl/maven/dsol/dsol-xml/1.6.9/

手动安装缺失的 jar 包到本地的 maven 仓库
4)再次运行,完成生成
生成的数据文件存储在 ${outputDir}/social_network。
参数设置
(以下参数介绍均省略了前缀“ldbc.snb.datagen.”,即参数的完整格式为“ldbc.snb.datagen.xxx”)
1)常规参数

2)规模因子
LDBC SNB 支持生成不同规模的图数据集,generator.scaleFactor 参数各取值对应的点边数目如下表:

(截图来源于官方文档 http://ldbcouncil.org/ldbc_snb_docs/ldbc-snb-specification.pdf)
3)序列化模式
Datagen 主要有 4 种 Csv 文件的序列化模式,所生成的数据格式各有不同。
CsvBasic
基础序列化模式,每种节点、节点和节点之间的关系都有独立的 csv 文件,如图一所示:

图一 每种节点、节点和节点之间的关系都有独立的 csv 文件,其中 person_xx.csv 均为 person 节点的属性数据。
若某个属性有多个取值,例如 person 的 email 属性有多个值,则将 person 的 email 记录单独生成一个 csv 文件,并将多个 email 分成多行记录展示,如图二所示:

图二 person 的 email 属性单独存储,并在多个 email 分成多条记录展示
CsvComposite(此模式生成的数据,与 GES 支持的 Csv 格式相似度最高)
在 CsvBasic 的基础上,将有多个值的属性和其他属性合并为一个记录,如图三;并将多个值进行合并(以 list 的格式,分号分隔),如图四;

图三 person 节点的属性记录合并为 person_0_0.csv

图四 language 和 email 两个 list 属性合并在一行
CsvMergeForeign
在 CsvBasic 基础上,如果节点间关系是 1 对多的,则将关系作为外键合并入节点的属性文件中展示,如图五

图五 将 comment-hasCreator->person、comment-isLocatedIn->place、comment-replyOf->post、comment-replyOf->comment relationship 与 comment 属性文件合并
CsvCompositeMergeForeign
是 CsvComposite 和 CsvMergeForeign 的结合,既合并了 list 属性,又将一对多关系进行了压缩表示,如图六

图六 place 列表示 person-isLocatedIn->place 关系的外键表示,同时 language 和 email 以 list 形式展示
各序列化模式对应的参数值如下
CsvBasic
ldbc.snb.datagen.serializer.dynamicActivitySerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.activity.CsvBasicDynamicActivitySerializer
ldbc.snb.datagen.serializer.dynamicPersonSerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.person.CsvBasicDynamicPersonSerializer
#ldbc.snb.datagen.serializer.staticSerializer:ldbc.snb.datagen.serializer.snb.csv.staticserializer.CsvBasicStaticSerializer
CsvComposite
ldbc.snb.datagen.serializer.dynamicActivitySerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.activity.CsvCompositeDynamicActivitySerializer
ldbc.snb.datagen.serializer.dynamicPersonSerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.person.CsvCompositeDynamicPersonSerializer
ldbc.snb.datagen.serializer.staticSerializer:ldbc.snb.datagen.serializer.snb.csv.staticserializer.CsvCompositeStaticSerializer
CsvMergeForeign
ldbc.snb.datagen.serializer.dynamicActivitySerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.activity.CsvMergeForeignDynamicActivitySerializer
ldbc.snb.datagen.serializer.dynamicPersonSerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.person.CsvMergeForeignDynamicPersonSerializer
ldbc.snb.datagen.serializer.staticSerializer:ldbc.snb.datagen.serializer.snb.csv.staticserializer.CsvMergeForeignStaticSerializer
CsvCompositeMergeForeign
ldbc.snb.datagen.serializer.dynamicActivitySerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.activity.CsvCompositeMergeForeignDynamicActivitySerializer
ldbc.snb.datagen.serializer.dynamicPersonSerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.person.CsvCompositeMergeForeignDynamicPersonSerializer
ldbc.snb.datagen.serializer.staticSerializer:ldbc.snb.datagen.serializer.snb.csv.staticserializer.CsvCompositeMergeForeignStaticSerializer
LDBC SNB 在 GES 中的应用
Datagen 生成的数据集与 GES 格式有以下 3 点区别
不同 label 的点 id 之间可能存在 id 重复的现象;
knows 关系是双向的;
没有标签列。
使用 DatagenToGES 数据转换脚本(基于 CsvComposite 序列化模式)可以将 LDBC 数,需在 python3.6 环境下运行。
DatagenTOGES 脚本有如下功能:
将 8 种节点类型映射为 1-8 个数字前缀,将原 id 转换为以数字前缀为开头、长度为 20bytes 的新 id,解决不同 label 的点之间 id 重复的问题;
增加 knows 边文件的反向边数据;
增加标签列。
转换前文件格式(csvComposite 序列化模式):


转换后文件格式:
DatagenToGES 转换规模因子为 100 的大规模数据集用时约半个小时。
数据转换脚本核心代码片段:

在 GES 中导入转换后的 LDBC SNB(示例数据为 SF0.1),并执行 PageRank 算法,效果如下图:

版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/beb8187358f546951c0878244】。文章转载请联系作者。
评论