使用图数据库的小伙伴有没有遇到这种场景:
初次使用图数据库,看网上说的天花乱坠,但还是拿不准性能究竟如何,想针对自己的业务场景做压测,又困于无法快速生成规模化的数据……
其实你需要的仅仅是一个能自动生成图测试数据的工具,有一个工具或许能给图数据库的压测带来帮助:
graph-datagen
这是一个用python语言编写的数据生成工具,专门为图数据库使用者自动生成测试数据集,通过简单配置自己业务场景中的图结构和生成规则,运行项目所提供的脚本就能自动生成指定规模并且贴近真实场景的数据集,为快速进行方案验证和性能测试提供帮助。
下面介绍下如何使用。
首先,下载项目代码:
git clone https://github.com/golfxiao/graph-datagen.git
准备项目的运行环境:
python 3.8+
pip install -r requirements.txt
PYTHONPATH
设置到项目目录下, 例如:/Users/[XXX]/Downloads/graph-datagen配置文件config.yaml
中主要有两块内容:
version: v1.0
description: nebula data generation
log:
path: ./target/log/datagen.log
level: info
clientSettings:
numWorkers: 1 # 并发线程数量
queueSize: 5 # 存储任务的数据缓存队列大小
locale: zh-CN # 目标语言,支持生成不同语言下的测试数据
graph中每个节点表示图DB中的一个点或一条边,每个节点都有两部分配置:
- output:
type: csv # 输出文件类型
path: ./target/data/student.csv # 生成数据的输出文件路径
batchSize: 5000 # 一次批量输出到文件的数据条数
csv:
withHeader: true # 文件中是只包含数据,还是也包含类似列头的字段名
schema:
type: vertex # vertex表示为点结构
genNum: 2000 # 此节点的生成数据条数
vertex: # 点的结构详情,此处不作展开
schema中有三部分组成:
vertex
和边edge
两种,分别说明。 vertex:
vid: # 点ID
type: string # 值类型为字符串
genrule: …… # 生成规则,此处先省略
tags:
- name: student # 点的TAG名称
props: # 点的属性
- name: name # 字段1:姓名
type: string # 值类型:字符串
genrule: …… # 生成规则,此处先省略
- name: age # 字段2:年龄
type: int # 值类型:整数
genrule: ……
- name: gender # 字段3:姓名
type: string # 值类型:字符串
genrule:
edge:
name: follow # 边名称
withRanking: true # 是否带Rank字段
genNumPerVID: # 边的生成规则,下面会描述
type: srcVID
genrule: ……
srcVID: # 边的起点ID
type: string
genrule: ……
dstVID: # 边的终点ID
type: string
genrule: ……
rank: # 边的排序字段
type: int
genrule: ……
props: # 边的属性
- name: likeness # 属性名
type: float # 值类型:浮点型
genrule: ……
这个schema结构是参考自开源nebula-importer
工具,规则基本与之相同,更详细说明可直接参考:Nebula Importer Schema配置
genNum
参数用于表示此节点要生成的总数量; schema:
type: vertex
genNum: 2000 # 生成点的总数量
vertex:
genNumPerVID
,用于配置每个srcVID出发要生成同类型但不同dstVID的边数量,这样配置是为了让边的数量更贴近业务场景,因为边反映的是一个点与其它点之间的业务联系; schema:
type: edge
edge:
name: follow
withRanking: true
genNumPerVID: # 边的生成规则
type: srcVID # 表示以srcVID来参考来配置边的生成倍数
genrule:
generator: random_int # 生成边的数量采用随机数规则,随机数取值范围1-20
min: 1
max: 20
genrule
接受的是一个字典结构配置,配置的字段主要分为两部分:
genrule:
generator: random_element # 所选生成器:随机枚举值
elements: ('male', 'female') # 生成器参数:可选枚举值列表
目前支持的generator分为两大类:
faker
是一个开源的数据mock项目,上面faker自带生成器只列了很小一部分,更多生成器参考:faker.providers
配置完图结构和生成规则后,在终端运行此脚本开始生成数据:
./main.py --config config.yaml
示例:项目的examples
目录下两个场景的配置文件示例可供参考,可以直接运行:
config_course.yaml
: 学生选课业务config_event.yaml
: 活动推荐业务关于执行耗时:两百万规模的数据大概需要100秒左右,两千万规模的数据大概需要1100秒左右;
关于多线程并发:项目配置文件中虽然支持num_workers配置工作线程数,不过经过实践,python中并发多线程对于加快运行效率作用不太明显,原因后来才得知是python中有全局解释器锁(GIL)的限制,多线程并不能利用多核心;