关于图数据库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)是以图这种数据结构存储和查询的数据库.与其他数据库不同,关系 ...
随机推荐
- hibernate中session.flush()
flush()session flush在commit之前默认都会执行, 也可以手动执行,他主要做了两件事: 1) 清理缓存. 2) 执行SQL. flush: Session 按照缓存中对象属性变化 ...
- Regex of Perl: ?= 指的是如果后面匹配到,则后面的内容不做替换,保留。 ab, s/a?=b/x/,变为xb,即后面匹配到b,b保留不做替换
Regex of Perl: ?= 指的是如果后面匹配到,则后面的内容不做替换,保留. ab, s/a?=b/x/,变为xb,即后面匹配到b,b保留不做替换
- “Spring Boot+Marklogic实战应用(1)”
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议.本文链接:http://www.blbk.info Spring Boot+Marklogic应用 摘要: 在前一节的介绍,相信 ...
- Linux inode的正确理解
一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统 ...
- Linux下查找Nginx配置文件位置
1.查看Nginx进程 命令: ps -aux | grep nginx 圈出的就是Nginx的二进制文件 2.测试Nginx配置文件 /usr/sbin/nginx -t 可以看到nginx配置文件 ...
- django框架进阶-CSRF认证
############################################### """ django中csrf的实现机制 #第一步:django第一次响应 ...
- docker里修改时间
在docker容器里,你会发现,你根本无法通过命令修改时间.这时我们就可以通过/etc/localtime这个配置文件修改时间了.但这个配置文件是一个二进制的文件,里面根本就是一堆乱码.所以我只好拷贝 ...
- python-django框架-电商项目-商品模块开发_20191124
用户浏览记录的添加 什么时候添加历史浏览记录? 在商品详情的视图里面添加浏览记录, 之前使用的list来存储浏览记录, 注意:如果good_id之前已经浏览过了,那就要移除,conn.lrem(his ...
- The Mean of the Sample Mean|Standard Deviation of the Sample Mean|SE
7.2 The Mean and Standard Deviation of the Sample Mean Recall that the mean of a variable is denote ...
- 基于ci框架 修改出来了一个带农历的万年历。
1这里没有写model:代码一看就懂,没什么负杂地方,就是麻烦一点. 直接control模块的代码: <?php if ( ! defined('BASEPATH')) exit('No dir ...