【图数据库性能和场景测试利器LDBC SNB】系列一:数据生成器简介 & 应用于GES服务

举报
闹闹与球球 发表于 2022/06/24 19:37:09 2022/06/24
【摘要】 本文主要介绍基于交互式查询所用的数据生成器(下文简称Datagen),及LDBC SNB数据如何在华为图引擎服务GES中应用。 LDBC SNB所预设的节点和关系、数据生成器和系统的测试用例,形成了一个逻辑自恰的数据“武林”,以ldbc snb为测试标准的图数据库产品,就像是行走于其中的侠客们,都得遵循同一套“武林规矩”(测试用例),究竟谁能击败各方高手,问鼎盟主呢?

LDBC SNB概述

LDBC SNB,全称The Linked Data Benchmark Council’s Social Network Benchmark,官网地址:http://ldbcouncil.orgLDBC是一个致力于发展图数据管理的产业联盟组织,它开发了一套标准的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介绍

  1. 数据模型
  • Data Types
  • Data Schema
  1. Datagen的安装和运行流程
  2. 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

本次调研主要使用基于伪分布式hadoopDatagen

1)        下载基于hadoopldbc datagen

https://github.com/ldbc/ldbc_snb_datagen_hadoop

2)        使用伪分布式的hadoop

cd ldbc_snb_datagen_hadoop/
cp params-csv-composite.ini params.ini
wget http://archive.apache.org/dist/hadoop/core/hadoop-3.2.1/hadoop-3.2.1.tar.gz
tar xf hadoop-3.2.1.tar.gz
export HADOOP_CLIENT_OPTS="-Xmx2G"
# set this to the Hadoop 3.2.1 directory
export HADOOP_HOME=`pwd`/hadoop-3.2.1
./run.sh

3)        编译时出现缺失的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=jar

4)        再次运行,完成生成

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主要有4Csv文件的序列化模式,所生成的数据格式各有不同。

CsvBasic

基础序列化模式,每种节点、节点和节点之间的关系都有独立的csv文件,如图一所示:


图一 每种节点、节点和节点之间的关系都有独立的csv文件,其中person_xx.csv均为person节点的属性数据。

若某个属性有多个取值,例如personemail属性有多个值,则将personemail记录单独生成一个csv文件,并将多个email分成多行记录展示,如图二所示:


图二 personemail属性单独存储,并在多个email分成多条记录展示

CsvComposite(此模式生成的数据,与GES支持的Csv格式相似度最高)

CsvBasic的基础上,将有多个值的属性和其他属性合并为一个记录,如图三;并将多个值进行合并(list的格式,分号分隔),如图四;

               

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

               

图四 languageemail两个list属性合并在一行

CsvMergeForeign

CsvBasic基础上,如果节点间关系是1对多的,则将关系作为外键合并入节点的属性文件中展示,如图五


图五 comment-hasCreator->personcomment-isLocatedIn->placecomment-replyOf->postcomment-replyOf->comment关系与comment属性文件合并

CsvCompositeMergeForeign

CsvComposite CsvMergeForeign的结合,既合并了list属性,又将一对多关系进行了压缩表示,如图六


图六 place列表示person-isLocatedIn->place关系的外键表示,同时languageemaillist形式展示

各序列化模式对应的参数值如下
# CsvBasic

snb.datagen.serializer.dynamicActivitySerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.activity.CsvBasicDynamicActivitySerializer
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

snb.datagen.serializer.dynamicActivitySerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.activity.CsvCompositeDynamicActivitySerializer
snb.datagen.serializer.dynamicPersonSerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.person.CsvCompositeDynamicPersonSerializer
snb.datagen.serializer.staticSerializer:ldbc.snb.datagen.serializer.snb.csv.staticserializer.CsvCompositeStaticSerializer

 

#CsvMergeForeign

snb.datagen.serializer.dynamicActivitySerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.activity.CsvMergeForeignDynamicActivitySerializer
snb.datagen.serializer.dynamicPersonSerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.person.CsvMergeForeignDynamicPersonSerializer
snb.datagen.serializer.staticSerializer:ldbc.snb.datagen.serializer.snb.csv.staticserializer.CsvMergeForeignStaticSerializer

 

# CsvCompositeMergeForeign

snb.datagen.serializer.dynamicActivitySerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.activity.CsvCompositeMergeForeignDynamicActivitySerializer
snb.datagen.serializer.dynamicPersonSerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.person.CsvCompositeMergeForeignDynamicPersonSerializer
snb.datagen.serializer.staticSerializer:ldbc.snb.datagen.serializer.snb.csv.staticserializer.CsvCompositeMergeForeignStaticSerializer

 

二、 LDBC SNB在GES中的应用

Datagen生成的数据集与GES格式有以下3点区别

  1. 不同label的点id之间可能存在id重复的现象;
  2. knows关系是双向的;
  3. 没有label列。

使用DatagenToGES数据转换脚本(基于CsvComposite序列化模式)可以将LDBC数,需在python3.6环境下运行。

DatagenTOGES脚本有如下功能:

  1. 8种节点类型映射为1-8个数字前缀,将原id转换为以数字前缀为开头、长度为20bytes的新id,解决不同label的点之间id重复的问题;
  2. 增加knows边文件的反向边数据;
  3. 增加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 + id


def 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算法,效果如下图:
 

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。