引言
使用图数据库的小伙伴有没有遇到这种场景:
初次使用图数据库,看网上说的天花乱坠,但还是拿不准性能究竟如何,想针对自己的业务场景做压测,又困于无法快速生成规模化的数据……
其实你需要的仅仅是一个能自动生成图测试数据的工具,有一个工具或许能给图数据库的压测带来帮助:
graph-datagen
这是一个用python语言编写的数据生成工具,专门为图数据库使用者自动生成测试数据集,通过简单配置自己业务场景中的图结构和生成规则,运行项目所提供的脚本就能自动生成指定规模并且贴近真实场景的数据集,为快速进行方案验证和性能测试提供帮助。
下面介绍下如何使用。
使用步骤
1. 环境准备
首先,下载项目代码:
git clone https://github.com/golfxiao/graph-datagen.git
目录如下所示:
准备项目的运行环境:
- 运行环境:
python 3.8+
- 安装项目依赖:
pip install -r requirements.txt
- 环境变量:将
PYTHONPATH
设置到项目目录下, 例如:/Users/[XXX]/Downloads/graph-datagen
2. 规则配置
配置文件config.yaml
中主要有两块内容:
- clientSettings: 运行配置,包括并发线程数,任务缓存队列大小,生成数据的目标语言,示例如下:
version: v1.0
description: nebula data generation
log:
path: ./target/log/datagen.log
level: info
clientSettings:
numWorkers: 1 # 并发线程数量
queueSize: 5 # 存储任务的数据缓存队列大小
locale: zh-CN # 目标语言,支持生成不同语言下的测试数据
- graph: 图的点、边结构以及每个点/边生成数量大小,还包括每个字段属性的生成方式(下面以学生选课场景为例示意);
2.1 图结构配置
graph中每个节点表示图DB中的一个点或一条边,每个节点都有两部分配置:
- schema:节点结构、生成数量及生成规则配置
- output:节点数据的输出配置,目前暂且只支持了csv一种格式;
- 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配置
- 生成数量,点和边的配置有所区分:
- vertex: 为每个点扩展了
genNum
参数用于表示此节点要生成的总数量;
schema:
type: vertex
genNum: 2000 # 生成点的总数量
vertex:
- edge: 为每条边扩展了一个预定义属性
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表示此属性的生成规则,具体下面会详细介绍;
2.2 生成规则配置
genrule
接受的是一个字典结构配置,配置的字段主要分为两部分:
- generator: 所选生成器,本质上是一个生成数量的方法名,调用方法即可生成相应类型的数量
- 生成器参数:除generator外的所有参数都会被认为是生成器参数,会作为命名参数传给生成器
genrule:
generator: random_element # 所选生成器:随机枚举值
elements: ('male', 'female') # 生成器参数:可选枚举值列表
目前支持的generator分为两大类:
- faker自带生成器,项目中约定:faker方法名就是生成器名称,方法参数就是生成器参数,统一以命名参数来配置;例如:
- random_int: 指定最小、最大值范围的随机整数,接受min和max参数表示数字的随机范围
- ramdom_number: 指定长度的数字串,接受digits表示要生成的数字长度;
- random_element: 指定列表范围内随机返回一个元素,接受elements(tuple类型)表示可选列表
- name: 人名,例如:张三
- sentence: 指定字长的句串,例如:如何自动生成数据
- company: 公司名称,例如:合联电子信息有限公司
- ……
- 自定义生成器:基于图结构需求补充扩展的自定义生成器,目前包括下面几个:
- id: ID递增序列,对应日常业务开发中的数据唯一标识(整数),可以结合prefix来生成str类型的唯一标识
- const: 定值常量,可以是整数也可以是字符串,例如:4,“E”
- reference: 引用变量,例如:a_{user_id},这个变量必须在同一个schema下
- eval: 计算表达式,例如:start_time+duration
- oftag: 从已有tag中取点ID,只适用于生成边的srcVID和dstVID场景,基于边的srcVID和dstVID必须是在点中存在的;
faker
是一个开源的数据mock项目,上面faker自带生成器只列了很小一部分,更多生成器参考:faker.providers
3. 运行脚本
配置完图结构和生成规则后,在终端运行此脚本开始生成数据:
./main.py --config config.yaml
4. 实践记录
示例:项目的examples
目录下两个场景的配置文件示例可供参考,可以直接运行:
config_course.yaml
: 学生选课业务config_event.yaml
: 活动推荐业务
关于执行耗时:两百万规模的数据大概需要100秒左右,两千万规模的数据大概需要1100秒左右;
关于多线程并发:项目配置文件中虽然支持num_workers配置工作线程数,不过经过实践,python中并发多线程对于加快运行效率作用不太明显,原因后来才得知是python中有全局解释器锁(GIL)的限制,多线程并不能利用多核心;
参考阅读: