首页 > 解决方案 > 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 核心足以满足集群中的每个节点。

标签: performanceimportcassandrajanusgraphgremlin-server

解决方案


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 和其他选项,直到您需要加载数亿条(或更多)边缘。


推荐阅读