当前位置:网站首页>【图数据库性能和场景测试利器LDBC SNB】系列一:数据生成器简介 & 应用于GES服务
【图数据库性能和场景测试利器LDBC SNB】系列一:数据生成器简介 & 应用于GES服务
2022-06-24 19:47:00 【华为云】
LDBC SNB概述
LDBC SNB,全称The Linked Data Benchmark Council’s Social Network Benchmark,官网地址: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介绍
- 数据模型
- Data Types
- Data Schema
- Datagen的安装和运行流程
- Datagen的参数设置
- 常规参数设置
- 规模因子
- 序列化模式
二、LDBC SNB在GES中的应用
一、Datagen介绍
1. 数据模型
1) Data Types
Datagen支持的属性datatype如下, 每种属性都支持单值和列表两种模式。
(截图来源于官方文档http://ldbcouncil.org/ldbc_snb_docs/ldbc-snb-specification.pdf)
2) Data Schema

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

这些预设的节点和关系,形成了一个逻辑自恰的数据“武林”,以ldbc snb为测试标准的图数据库产品,就像是行走于其中的侠客们,都得遵循同一套“武林规矩”(测试用例),究竟谁能击败各方高手,问鼎盟主呢?且拭目以待吧。
2. 安装和运行流程
在Interactive Workload模式下,Datagen的底座为hadoop;在BI Workload模式下,底座为Spark。
本次调研主要使用基于伪分布式hadoop的Datagen。
1) 下载基于hadoop的ldbc datagen
https://github.com/ldbc/ldbc_snb_datagen_hadoop
2) 使用伪分布式的hadoop
cd ldbc_snb_datagen_hadoop/cp params-csv-composite.ini params.iniwget http://archive.apache.org/dist/hadoop/core/hadoop-3.2.1/hadoop-3.2.1.tar.gztar xf hadoop-3.2.1.tar.gzexport HADOOP_CLIENT_OPTS="-Xmx2G"# set this to the Hadoop 3.2.1 directoryexport HADOOP_HOME=`pwd`/hadoop-3.2.1./run.sh3) 编译时出现缺失的jar包问题解决(报错如下)

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

手动安装缺失的jar包到本地的maven仓库
mvn install:install-file -Dfile=dsol-xml-1.6.9.jar -DgroupId=dsol -DartifactId=dsol-xml -Dversion=1.6.9 -Dpackaging=jar4) 再次运行,完成生成
sh run.sh生成的数据文件存储在${outputDir}/social_network。
3. 参数设置
(以下参数介绍均省略了前缀“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关系与comment属性文件合并
CsvCompositeMergeForeign
是CsvComposite和 CsvMergeForeign的结合,既合并了list属性,又将一对多关系进行了压缩表示,如图六

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

转换后文件格式:

DatagenToGES转换规模因子为100的大规模数据集用时约半个小时。
数据转换脚本核心代码片段:
def form_full_id(prefix, id): zero_num = 19 - len(id) if zero_num < 0: return id return prefix + '0' * zero_num + iddef process_vertex(label, absPath): prefix = id_prefix[label] print('start process vertex with label [' + label + ']') data_csv = pd.read_csv(absPath, sep=csv_delimiter, dtype=str) # print('csv文件原始数据为:') # print(data_csv) data_csv.insert(1, 'label', label) data_csv['id'] = data_csv['id'].apply(lambda x: form_full_id(prefix, x)) # print('csv文件更新数据为:') # print(data_csv) data_csv.to_csv(output_vertex_path + label + '.csv', index=False, sep=',') print('finish process vertex with label [' + label + ']\n')def process_edge(label_src, label_edge, label_dst, absPath): prefix_src = id_prefix[label_src] prefix_dst = id_prefix[label_dst] label_join = '-'.join([label_src, label_edge, label_dst]) print('start process edge with label [' + label_join + ']') data_csv = pd.read_csv(absPath, sep=csv_delimiter, dtype=str) # print('csv文件原始数据为:') # print(data_csv) data_csv.insert(2, 'label', label_edge) id_header_src = id_header_in_edge_file[label_src] data_csv[id_header_src] = data_csv[id_header_src].apply(lambda x: form_full_id(prefix_src, x)) if label_src == label_dst: id_header_dst = id_header_src + '.1' else: id_header_dst = id_header_in_edge_file[label_dst] data_csv[id_header_dst] = data_csv[id_header_dst].apply(lambda x: form_full_id(prefix_dst, x)) # print('csv文件更新数据为:') # print(data_csv) data_csv.to_csv(output_edge_path + label_join + '.csv', index=False, sep=',') if (label_edge == 'knows'): dst = data_csv[id_header_dst] data_csv.drop(labels=[id_header_dst], axis=1, inplace=True) data_csv.insert(0, label_dst, dst) data_csv.to_csv(output_edge_path + label_join + '-reverse.csv', index=False, sep=',') print('end process edge with label [' + label_join + ']\n')在GES中导入转换后的LDBC SNB(示例数据为SF0.1),并执行PageRank算法,效果如下图:

边栏推荐
- Hyperledger Fabric 2. X dynamic update smart contract
- The R language uses the matchit package for propensity matching analysis and match The data function constructs the matched sample set, and judges the balance of all covariates in the sample after the
- Assessment of public finance of Jilin University in March of the 22nd spring -00091
- Tomorrow is the PMP Exam (June 25). Have you understood all this?
- SAP PA certificate for no birds, which can be tested by new peers
- Redis source code analysis skip list
- 明天就是PMP考试了(6月25日),这些大家都了解了吗?
- 一文理解OpenStack网络
- Using ADC to control brushless motor source program STM32 library function
- Is there really something wrong with my behavior?
猜你喜欢

QT cannot be edited with UTF-8

openGauss内核:简单查询的执行

中学校园IP网络广播系统解决方案-校园数字IP广播系统方案设计指南

JPA学习1 - 概述、JPA、JPA核心注解、JPA核心对象

js监听页面或元素scroll事件,滚动到底部或顶部

(Smooth)ScrollToPosition doesn't work properly with RecyclerView

2021-2022 China's financial digitalization "new" insight Industry Research Report

Phprunner 10.7.0 PHP code generator

Why is it that the "Zhongtai" that was originally eaten by civil engineering is no longer fragrant?

JS listens for page or element scroll events, scrolling to the bottom or top
随机推荐
Inventory of data governance status of six major banks: governance architecture, data standards and data middle office (April 2022)
Hibernate学习3 - 自定义SQL
Scala IO reads binary files
Understanding openstack network
Tiktok practice ~ upload and release app video
抖音实战~发布短视频流程梳理
Printf redirection of serial port under sw4stm32 (SW4)
Hyperledger Fabric 2. X dynamic update smart contract
7-7 solving mode problems
First person singular reading notes
libnum库简单使用(进制字符串转换)
The file containing the file operation vulnerability (6)
5年,从“点点点”到现在的测试开发,我的成功值得每一个借鉴。
Yyds dry goods counting uses xshell to implement agent function
中学校园IP网络广播系统解决方案-校园数字IP广播系统方案设计指南
openGauss内核:简单查询的执行
China CAE industry investment strategic planning and future development analysis report 2022 ~ 2028
Nacos究竟是什么
Latest development of jetpack compose
MySQL semi sync replication