关于图数据库HugeGraph的百万,千万,亿量级测试
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的查询未进行测试。
该文档仅代表测试情况,具体数据仅具供参考
关于图数据库HugeGraph的百万,千万,亿量级测试的更多相关文章
- 图数据库HugeGraph源码解读 (1) —— 入门介绍
HugeGraph介绍 以下引自官方文档: HugeGraph是一款易用.高效.通用的开源图数据库系统(Graph Database,GitHub项目地址), 实现了Apache TinkerPop3 ...
- 图数据库HugeGraph:HugeGraph-Hubble基于Web的可视化图管理初体验
原创/朱季谦 一.HugeGraph-Hubble简介 关于HugeGraph,官方资料是这样介绍的,它是一款易用.高效.通用的开源图数据库系统(Graph Database), 实现了 Apache ...
- 图数据库 Nebula Graph 是什么
图数据库(英语:Graph Database)是一个使用图结构进行语义查询的数据库.该系统的关键概念是图,形式上是点 (Node 或者 Vertex) 和边 (Edge 或者 Relationship ...
- 图数据库对比:Neo4j vs Nebula Graph vs HugeGraph
本文系腾讯云安全团队李航宇.邓昶博撰写 图数据库在挖掘黑灰团伙以及建立安全知识图谱等安全领域有着天然的优势.为了能更好的服务业务,选择一款高效并且贴合业务发展的图数据库就变得尤为关键.本文挑选了几款业 ...
- 陈宏智:字节跳动自研万亿级图数据库ByteGraph及其应用与挑战
导读: 作为一种基础的数据结构,图数据的应用场景无处不在,如社交.风控.搜广推.生物信息学中的蛋白质分析等.如何高效地对海量的图数据进行存储.查询.计算及分析,是当前业界热门的方向.本文将介绍字节跳动 ...
- 主流图数据库Neo4J、ArangoDB、OrientDB综合对比:架构分析
主流图数据库Neo4J.ArangoDB.OrientDB综合对比:架构分析 YOTOY 关注 0.4 2017.06.15 15:11* 字数 3733 阅读 16430评论 2喜欢 18 1: 本 ...
- linux环境下安装可操作图库语言Gremlin的图框架HugeGraph
原创/朱季谦 图数据库是一项比较前沿而逐渐热门的技术,是NoSql数据库的一种,它应用图形理论存储实体之间的关系信息,最主要的组成有两种,结点集和连接结点的边.常见的图数据库有Neo4j,Januas ...
- 主流开源分布式图数据库 Benchmark
本文由美团 NLP 团队高辰.赵登昌撰写 首发于 Nebula Graph 官方论坛:https://discuss.nebula-graph.com.cn/t/topic/1377 1. 前言 近年 ...
- OPPO 图数据库平台建设及业务落地
本文首发于 OPPO 数智技术公众号,WeChat ID: OPPO_tech 1.什么是图数据库 图数据库(Graph database)是以图这种数据结构存储和查询的数据库.与其他数据库不同,关系 ...
随机推荐
- Complier
Complier [2019福建省赛] 模拟题应该有信心写,多出一些样例 当/* 与// 在一起的时候总会出错,一旦出现了这些有效的 应该把它删掉不对后面产生影响 #include<bits/s ...
- 在线好用的json转xml超级好用在线json与xml互相转换
在线好用的json转xml超级好用在线json与xml互相转换 拿走不谢:http://www.yzcopen.com/json/jsonxmlformat
- java作业-----方法重载
满足方法重载的条件:1.方法名相同 2.参数类型不同,参数个数不同,参数类型的顺序不同. 同时,方法的返回值不作为方法重载的判断条件.
- 系统学习Javaweb7----JavaScript3
学习内容: 1.JavaScript语法规则----全局函数 2.JavaScript语法规则----自定义函数 3.BOM对象 3.1BOM对象--消息框 3.2BOM对象--循环定时器 3.3BO ...
- 关于Java中注解的总结
注解用来给类声明附加额外信息,可以标注在类.字段.方法等上面,编译器.JVM以及开发人员等都可以通过反射拿到注解信息,进而做一些相关处理 Java中注解的知识结构图 常用注解 @Override ...
- JS创建数组的三种方法
1 常规方式 创建数组并给数组元素赋值 var myCars = new Array(); myCars[0] = "Saab"; myCars[1] = "Vo ...
- LTE-U/LAA
将LTE扩展至非授权频谱,得益于一个稳健的无线电通信线路,具有更好协调性的同步节点,以及以授权频谱为基点的载波聚合,LTE-U/LAA能提供比载波Wi-Fi更佳的网络性能和更强的用户体验,为移动运营商 ...
- Jenkins+maven+jmeter+eclipse搭建自动化测试平台
一.准备工作 1.jmeter准备测试脚本 2.maven环境配置 3.eclipse创建maven项目 4.Jenkins集成项目 二.jmeter准备测试脚本 使用jmeter准备测试脚本(不管录 ...
- python数据类型:元组
python数据类型:元组 python的元组与列表类似,但是元组的元素不能修改 元组使用小括号,列表使用大括号 元组创建简单,只需要在括号中添加元素,使用逗号隔开 创建元组: tup1 = (50, ...
- G 小石的图形
题目链接:https://ac.nowcoder.com/acm/contest/949/G 思路: 思路是很简单,一个小学数学题.但是n次WA后才过,重点就在pi的表示上,pi最精确的表示方式是ac ...