performance - Janusgraph(GremlinServer) 导入提高性能
问题描述
我正在尝试导入 1GB 的图形数据(由约 10 万个顶点、360 万条边组成),它是gryo格式。我尝试通过 gremlin-client 导入,出现以下错误:
gremlin> graph.io(IoCore.gryo()).readGraph('janusgraph_dump_2020_09_30_local.gryo') 超出 GC 开销限制 输入 ':help' 或 ':h' 寻求帮助。显示堆栈跟踪?[yN]y java.lang.OutOfMemoryError:在 org.cliffc.high_scale_lib.NonBlockingHashMapLong.initialize(NonBlockingHashMapLong.java:241) 的 org.cliffc.high_scale_lib.NonBlockingHashMapLong$CHM.(NonBlockingHashMapLong.java:471) 超出 GC 开销限制
Gremlin-Server、Cassandra 详细介绍如下:
Gremlin 服务器:
Janusgraph 版本:0.5.2 Gremlin 版本:3.4.6
Heap: JAVA_OPTIONS="-Xms4G -Xmx4G …
// gremlin conf
threadPoolWorker: 8
gremlinPool: 16
scriptEvaluationTimeout: 90000
// cql props
query.batch=true
Cassandra 在具有 3 个节点的集群中
卡桑德拉版本:3.11.0
节点1:内存:8GB,Cassandra 堆:1GB (-Xms1G -Xmx1G) 节点
2:内存:8GB,Cassandra 堆:4GB (-Xms4G -Xmx4G)
节点3:内存:8GB,Cassandra 堆:4GB (-Xms4G -Xmx4G)
每个节点都安装了 Gremlin-Server(客户端负载均衡器)。但是我们在 Node1 中执行 gremlin 查询。
有人可以帮我解决以下问题:
我需要做什么导入(任何配置更改)?
>>> 将大量数据导出/导入 Janusgraph(Gremlin-Server)的最佳方法是什么? (我需要这个答案)
有什么办法可以分块导出数据并分块导入?
提前致谢。
编辑:
我已将 Node1、Gremlin-Server Heap 增加到 2GB。导入查询响应被取消。也许,对于 Gremlin 和 Cassandra 来说,RAM 分配是不够的。这就是为什么我将它保持为 1GB,以便执行查询。
考虑到海量数据(数十亿个顶点/边),这非常少,希望 8GB RAM 和 2/4 核心足以满足集群中的每个节点。
解决方案
Graph.io()
现在首选的 Gremlin 步骤io()
使用GryoReader
来读取您的文件(除非图形提供程序覆盖了后面的 Gremlinio()
步骤,并且我认为 JansuGraph 不会这样做)。因此,如果您使用,GryoReader
您通常最终需要大量内存(比您预期的要多),因为它拥有所有顶点的缓存以加快加载速度。最终,它的加载效率并不高,并且从 TinkerPop 的角度来看,提供商将通过拦截io()
遇到时迈步。在没有这种优化的情况下,一般建议是直接使用您正在使用的图表的批量加载工具。对于 JanusGraph,这可能意味着将您自己的加载并行化为脚本的一部分或使用 Gremlin OLAP 加载方法。一些建议可以在JanusGraph 文档以及这些博客文章中找到:
https://medium.com/@nitinpoddar/bulk-loading-data-into-janusgraph-ace7d146af05 https://medium.com/@nitinpoddar/bulk-loading-data-into-janusgraph-part-2-ca946db26582
您还可以考虑自定义VertexProgram
批量加载。TinkerPop 具有CloneVertexProgram
更通用的继任者BulkLoaderVertexProgram
(现在已在最近的版本中弃用/删除),它在 JanusGraph 中颇受欢迎,因为它是在 TinkerPop 不再尝试提供此类功能之前的通用批量加载工具。
在几百万条边的规模上,我可能会编写一个小型 groovy 脚本,该脚本将在 Gremlin 控制台中运行,将我的数据直接加载到图形中,避免首先尝试使用像 Gryo 这样的中间格式。它可能会更快,并且可以让您不必深入研究 JanusGraph 的批量加载策略。如果您选择这种情况,那么我在上面提供的 JanusGraph 文档的链接应该对您最有帮助。您可以不用担心使用 OLAP、Spark 和其他选项,直到您需要加载数亿条(或更多)边缘。
推荐阅读
- html - ng-点击
- google-cloud-storage - 如何从谷歌云存储中获取数据?
- python - 从文档 Mongodb 中的数组中查询与查询匹配的元素
- c - Linux驱动程序try & catch
- javascript - html中的html javascript中的html
- compilation - 将 Nmap 编译为静态二进制文件
- java - 未能在项目 spring-boot-security-oauth2-google 上执行目标 org.springframework.boot:spring-boot-maven-plugin:1.4.2.RELEASE:run (default-cli)
- c# - .Net Core 2 和 AngularJS SPA 不工作
- python - Django 将计算天数字段与浮点列相乘
- javascript - ASP.Net MVC LabelFor 无法处理回发或页面加载