关于图数据库HugeGraph的百万,千万,亿量级测试
IT入门学生 人气:0
1、Hugegraph测试硬件
1.1、本机硬件
本机测试hugeGraph版本:0.10.4
后置存储数据库:rocksdb,1TB的普通硬盘
1.2、测试服务器硬件
测试服务器hugegraph版本:0.9.2,服务器分配16G空间,16核
后置存储数据库cassandra:3.11.0,存储空间未限制,普通硬盘
2、基准测试
2.1、数据加载
加载功能:hugegraph自带的原生的导入工具,其schema定义其数据类型,索引和边标签属性,struct定义边。
加载大量数据时间和速度:主要是测试百万,千万,亿级别的加载速度。
2.2、查询性能
查询响应时间——针对于多度查询
查询响应时间——针对于遍历所有路径查询
查询响应时间——针对于最短路径查询
3、测试报告
3.1、本机和测试flink写入速度
测试 |
写入速度 |
硬件情况 |
本地流程 |
前期数据量少大概4000条/分钟(数据量大概10多万)后期数据量大的写入未进行测试。 |
Intel® Core™ i5-9400 CPU @ 2.90GHz × 6,RocksDB后置数据库存储内存1TB |
测试flink |
前期数据量比较少大概写入2624条/分钟(3h38m-571988) 后期数据量多了大概写入1200/分钟(3d2h-5292999) |
hugeGraph的16G,16核,Cassandra后置数据库存储内存未做限制 服务器上的写入速度小于本地写入速度原因: 1、服务器硬件 2、网络不稳定性 |
3.2、数据快速导入查询
3.2.1、百万级别导入
3.2.2、百万级别数据查询
点:150万
边:75万+新增边1万
查询最多五度,点定义有六个属性值,边只有一个属性值(id)
耗时 查询 |
g.V() |
g.E() |
g.V().out() |
g.V().outE()或g.V().inE() |
g.V().drop()或g.E().drop() |
第一次耗时 |
0.656S |
0.315S |
报错 |
报错 |
报错 |
第一次查询后均耗时 |
0.04S |
0.04S |
报错 |
报错 |
报错 |
原因 |
g.V()遍历只显示250条数据 |
g.E()遍历只显示250条数据 |
错误的请求,已超过最大数值 |
遍历的最大值不能超过80万 |
删除的最大值不能超过1万 |
遍历所有点的g.V().out()报错:请求错误
遍历所有点的出边g.V().outE()或g.V().inE()报错:最大值不能超过80W
删除所有点的数据g.V().drop()或g.E().drop()报错:最大值不能超过1W
3.2.2.1、多度查询
时间 多度 |
一度 |
二度 |
三度 |
四度 |
五度 |
查询单个点 |
查询耗时 |
0.04S |
0.03S |
0.03S |
0.03S |
由于数据问题,此次查询数据结果和四度一样,时间没有参考意义 |
0.03S——g.V().hasLabel("person").has("id","id值") |
3.2.2.2、路径遍历
路径分为两种:有环路径和无环路径。
有环路径是指路径中至少有一个对象出现的次数大于等于两次。
无环路径是指路径中所有的对象只出现一次。
查询未过滤环路的路径遍历:
时间 遍历路径 |
一层 |
二层 |
三层 |
四层 |
查询耗时 |
均耗时:0.075S |
第一次:0.274S 后均耗时:0.08S |
均耗时:0.1S |
第一次:0.875S 后均耗时:0.085S |
查询已过滤环路的路径遍历:
时间 遍历路径 |
一层 |
二层 |
三层 |
四层 |
五层 |
查询耗时 |
第一次:2.729S 后均耗时:0.450S
|
第一次:1.983S 后均耗时:0.300S
|
第一次:5.849S 后均耗时:5.210S
|
第一次:6.881S 后均耗时:6.75S |
Error! Failed to do request 没有存在五层的数据,导致查询报错 |
3.2.2.3、最短路径查询
g.V("src_v_id")
.repeat(both().simplePath()).until(hasId("target_v_id")
.and().loops().is(lte(4))).hasId("target_v_id")
.path().limit(10)
src_v_id:起点顶点ID
target_v_id:终点顶点ID
lte(4):深度小于4
limit(10) :显示10条数据
如果不限制数据量:将10改为-1
时间 最短路径 |
深度小于2 |
深度小于3 |
深度小于4 |
深度小于5 |
查询耗时 |
第一次:0.894S 后均耗时:0.055S |
均耗时:0.055S |
第一次:0.347S 后均耗时:0.050S |
第一次:0.241S 后均耗时:0.060S |
3.2.3、千万级别导入
点:1500W 耗时:2H
边:750万 耗时:1H38M
3.2.4、千万级别数据查询
耗时 查询 |
g.V() |
g.E() |
g.V().out() |
g.V().outE()或g.V().inE() |
g.V().drop()或g.E().drop() |
第一次耗时 |
1.212S |
0.449S |
报错 |
报错 |
报错 |
第一次查询后均耗时 |
0.05S |
0.234S |
报错 |
报错 |
报错 |
原因 |
g.V()遍历只显示250条数据 |
g.E()遍历只显示250条数据 |
错误的请求,已超过最大数值 |
遍历的最大值不能超过80万 |
删除的最大值不能超过1万 |
3.2.4.1、多度查询
时间 多度 |
一度 |
二度 |
三度 |
四度 |
五度 |
查询单个点 |
第一次查询耗时 |
1.065S |
2.218S |
1.149S |
1.222S |
1.453S |
开始查询耗时:0.232S 多次查询后均耗时:0.035S——g.V().hasLabel("person").has("id","161f2f39beb3bdc6f2d0747a15fcefd5") |
第一次查询后多次查询均耗时 |
0.04S |
0.04S |
0.03S |
0.03S |
0.03S |
3.2.4.2、路径遍历
时间 遍历路径 |
一层 |
二层 |
三层 |
四层 |
查询耗时 |
第一次:0.958S 后均耗时:0.08S
|
第一次:0.639S 后均耗时:0.08S
|
存在环路的三层和四层路径遍历,存在对象大于等于2的情况,而且数据边的不完整性,查询的时间不具有参考性。 |
查询已过滤环路的路径遍历:
时间 遍历路径 |
一层 |
二层 |
三层 |
四层 |
五层 |
查询耗时 |
第一次:0.742S 后均耗时:0.075S
|
第一次:1.284S 后均耗时:0.096S
|
第一次:6.483S 后均耗时:5.111S
|
第一次:7.574S 后均耗时:6.876S |
Error! Failed to do request 没有存在五层的数据,导致查询报错 |
3.2.4.3、最短路径查询
时间 最短路径 |
深度小于2 |
深度小于3 |
深度小于4 |
深度小于5 |
查询耗时 |
第一次:2.728S 后均耗时:0.055S |
均耗时:0.082S |
耗时:0.31S |
耗时:0.264S |
3.2.5、亿级别数据导入
点:1.05亿 耗时:13H35M34S
边:5268万 耗时:12H36M
3.2.6、亿级别数据查询
耗时 查询 |
g.V() |
g.E() |
g.V().out() |
g.V().outE()或g.V().inE() |
g.V().drop()或g.E().drop() |
第一次耗时 |
1.841S |
1.835S |
报错 |
报错 |
报错 |
第一次查询后均耗时 |
0.212S |
0.250S |
报错 |
报错 |
报错 |
原因 |
g.V()遍历只显示250条数据 |
g.E()遍历只显示250条数据 |
错误的请求,已超过最大数值 |
遍历的最大值不能超过80万 |
删除的最大值不能超过1万 |
页面上限制显示250条数据:limit(251)
3.2.6.1、多度查询
时间 多度 |
一度 |
二度 |
三度 |
四度 |
五度 |
查询单个点 |
第一次查询耗时 |
7.352S |
3.958S |
3.149S |
3.12S |
1.453S |
开始查询耗时:0.136S 多次查询后均耗时:0.030S——g.V().hasLabel("person").has("id","161f2f39beb3bdc6f2d0747a15fcefd5") |
第一次查询后多次查询均耗时 |
0.254S |
0.057S |
0.04S |
0.045S |
0.03S |
3.2.6.2、路径遍历
路径分为两种:有环路径和无环路径。
有环路径是指路径中至少有一个对象出现的次数大于等于两次。
无环路径是指路径中所有的对象只出现一次。
查询未过滤环路的路径遍历:
时间 遍历路径 |
一层 |
二层 |
三层 |
四层 |
查询耗时(id:d9530e5495fbf25d7aae082e8a65c722) |
查询耗时:0.759S |
查询耗时:2.77S
|
环路的三层和四层路径遍历,存在对象大于等于2的情况,而且数据边的不完整性,查询的时间不具有参考性。 |
|
查询耗时(id:161f2f39beb3bdc6f2d0747a15fcefd5) |
查询耗时:2.28S
|
查询耗时:1.358S
|
查询已过滤环路的路径遍历:
时间 遍历路径 |
一层 |
二层 |
三层 |
四层 |
五层 |
查询耗时(id:d9530e5495fbf25d7aae082e8a65c722) |
第一次:1.213S 后均耗时:0.095S
|
第一次:2.659S 后均耗时:0.116S
|
第一次:29.457S 后均耗时:14.990S
|
第一次:12.604S 后均耗时:9.01S
|
第一次:1.421S 后均耗时:0.122S
|
查询耗时(id:161f2f39beb3bdc6f2d0747a15fcefd5) |
第一次:2.024S 后均耗时:0.080S
|
第一次:1.777S 后均耗时:0.096S
|
第一次:10.318S 后均耗时:5.199S
|
第一次:8.816S 后均耗时:6.615S
|
Error! Failed to do request 没有存在五层的数据,导致查询报错 |
3.2.6.3、最短路径查询
时间 最短路径 |
深度小于2 |
深度小于3 |
深度小于4 |
查询耗时 |
报错:Error! Failed to do request
|
由于深度小于2的报错,深度3测跑也报错,深度小于4的未进行操作。 |
4、测试总结:
①:当点的数据达到亿级别的时候,最短路径查询出现Error!Failed to do request,不知道是由于什么原因导致该查询出现错误,需到issue上查找是否有针对于该错误的具体的原因。
②:后端存储数据库cassandra是分布部署到三台服务器上,对于单服务器部署cassandra的查询未进行测试。
该文档仅代表测试情况,具体数据仅具供参考
加载全部内容