我正在尝试导入1gb的图形数据(由~100k个顶点,360万条边组成),这是gryo格式。我试图通过gremlin客户端导入,但出现以下错误:
gremlin>graph.io(iocore.gryo()).readgraph('janusgraph\u dump\u 2020\u 09\u 30\u local.gryo')超出gc开销限制类型:help或:h以获取帮助。显示堆栈跟踪[yn]y java.lang.outofmemoryerror:在org.cliffc.high\u scale\u lib.nonblockinghashmaplong$chm处超出gc开销限制。(nonblockinghashmaplong。java:471)在org.cliffc.high\u scale\u lib.nonblockinghashmaplong.initialize(nonblockinghashmaplong。java:241)
gremlin服务器,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个节点
Cassandra版本:3.11.0
节点1:ram:8gb,cassandra堆:1gb(-xms1g-xmx1g)
node2:ram:8gb,cassandra堆:4gb(-xms4g-xmx4g)
node3:ram:8gb,cassandra堆:4gb(-xms4g-xmx4g)
每个节点都安装了gremlin服务器(客户端负载均衡器)。但是我们正在node1中执行gremlin查询。
有人能在以下方面帮助我吗:
导入(任何配置更改)需要做什么?
将大量数据导出/导入janusgraph(gremlin服务器)的最佳方法是什么(我需要答案)
有没有什么方法可以将数据导出成块并导入成块?
提前谢谢。
编辑:
我已经将node1,gremlin服务器堆增加到2gb。导入查询响应已取消。也许,对于gremlin和cassandra来说,ram分配是不够的。这就是为什么我将其保持在1gb,以便执行查询。
考虑到巨大的数据量(数十亿个顶点/边),这是非常少的,希望8gbram和2/4内核对于集群中的每个节点都足够了。
1条答案
按热度按时间camsedfj1#
Graph.io()
现在更喜欢的是小精灵io()
使用GryoReader
读取文件(除非图形提供程序覆盖后一个gremlin)io()
我不认为詹瑟格有)。所以,如果你用GryoReader
通常情况下,最终需要大量内存(比预期的要多),因为它包含所有顶点的缓存以加快加载速度。最终,它在加载方面的效率不是很高,而且从tinkerpop的Angular 来看,它的期望是提供商可以通过截取本地的批量加载程序来优化加载io()
遇到问题时执行步骤。在没有这种优化的情况下,一般建议使用直接使用的图的批量加载工具。对于janusgraph,这可能意味着将加载作为脚本的一部分进行并行化,或者使用gremlin olap加载方法。一些建议可以在janusgraph文档以及这些博客文章中找到:https://medium.com/@nitinpoddar/bulk-加载-data-into-janusgraph-ace7d146af05https://medium.com/@nitinpoddar/bulk-加载-data-into-janusgraph-part-2-ca946db26582
你也可以考虑一个习惯
VertexProgram
散装货物。tinkerpop拥有CloneVertexProgram
哪一个是更普遍的继承者BulkLoaderVertexProgram
(现在在最新版本中已被弃用/删除)在tinkerpop不再尝试提供这种功能之前,janusgraph作为一种通用的批量加载工具受到了一定的欢迎。在你几百万条边的规模下,我可能会编写一个小的groovy脚本,在gremlin控制台中运行,直接将数据加载到图形中,避免尝试先使用gryo这样的中间格式。它可能会走得更快,并将节省你不得不挖掘太多的散装战术为janusgraph。如果您选择这种情况,那么我上面提供的janusgraph文档的链接应该对您有很大帮助。您可以省去使用olap、spark和其他选项的烦恼,直到您有数以亿计的边(或更多)要加载。