使用Neo4j导入工具导入大型数据集需要很长时间(>12小时)

4
我有一个大数据集(约10亿个节点和几十亿个关系),我正在尝试将其导入到Neo4j中。我正在使用Neo4j导入工具。节点在一个小时内完成导入,但是自那时以来,导入器已经在节点索引准备阶段停滞了超过12个小时(除非我错误地读取下面的输出)。
... 可用内存: 空闲机器内存:184.49 GB 最大堆内存:26.52 GB
节点 [>:23.39 MB/s---|属性|节点:|标签|*v:37.18 MB/s---------------------------------------------] 1B 在1小时7分钟18秒54毫秒内完成 准备节点索引 [*排序:11.52 GB--------------------------------------------------------------------------------]881M ...
我的问题是如何加快这个速度?我在考虑以下内容: 1. 将节点和关系的导入命令拆分并进行节点导入。 2. 在节点上创建索引 3. 进行合并/匹配以消除重复项 4. 进行关系导入。
这样会有帮助吗?还有其他我应该尝试的方法吗?堆大小太大了吗(我认为不是,但想要一个意见)?
谢谢。
更新 我也尝试在同一台机器上导入完全相同的一半数据,并且它再次在大约相同的时间(比例上)在那个阶段卡住了。因此,我基本上排除了磁盘空间和内存问题。 我还检查了我的标头(因为我注意到其他人在拥有不正确的标头时遇到了这个问题),它们对我来说似乎是正确的。您对我应该看什么还有其他建议吗?
进一步更新 好吧,现在变得有点荒谬了。我将数据大小缩小到只有一个大文件(约3G)。它只包含单一类型的节点,并且仅具有ID。因此,数据看起来像这样
1|作者 2|作者 3|作者
标头(在单独的文件中)如下所示
authorID:ID(作者)|:LABEL
我的导入仍然在排序阶段卡住了。我很确定我在这里做错了什么。但是我真的不知道是什么。这是我调用此命令行的方式
/var/lib/neo4j/bin/neo4j-import --into data/db/graph.db --id-type string --delimiter "|" \ --bad-tolerance 1000000000 --skip-duplicate-nodes true --stacktrace true --ignore-empty-strings true \ --nodes:Author "data/author/author_header_label.csv,data/author/author_half_label.csv.gz"
大多数 bad-tolerance 和 skip-duplicate-nodes 的选项都是为了看看是否可以使其至少通过一次导入。

我收回之前的话,它是2.2.5版本。 - panache
我刚刚尝试导入了一个包含1.7B个节点,具有“1 | 作者”,“2 | 作者”等数据的确切布局,分为标题和压缩数据csv文件。它运行得很好:[*SORT:19,93 GB--------------------------------------------------------------------------------] 2B 也就是说,已经确认已经超过了你的程序卡住的点。导入完成后,“准备节点索引”阶段花费了20分钟。 - Mattias Finné
我想我找到了问题所在。我使用了这里的一些提示<br/>链接,其中说我可以重复使用相同的csv文件,但是使用不同的标题——一次用于节点,一次用于关系。我低估了我使用的数据的1-n(ness),导致ID上有很多重复项。那个阶段基本上几乎全部花费在尝试排序和去重上。重新编写我的查询以将数据拆分为节点和关系文件,解决了这个问题。感谢您的关注! - panache
好的,非常好。您是否建议更改文档以使其他人避免这些问题? - Mattias Finné
是的。请在此文档http://neo4j.com/developer/guide-import-csv/#_super_fast_batch_importer_for_huge_datasets中指定,如果您在节点和关系之间重复使用具有不同标题的同一文件,请注意会有重复的ID需要去重(可能需要时间)。 - panache
显示剩余6条评论
2个回答

2
我想我找到了问题所在。我使用了这里的一些技巧http://neo4j.com/developer/guide-import-csv/#_super_fast_batch_importer_for_huge_datasets,其中说我可以重复使用同一个csv文件,只需使用不同的标头--一次用于节点,一次用于关系。我低估了我使用的数据的1-n性,导致ID上有很多重复。那个阶段基本上几乎全部都花在了尝试排序和去重上。重新设计我的查询以将数据拆分为节点和关系文件,解决了这个问题。感谢您的关注!
所以基本上,最好始终为每种类型的节点和关系单独拥有文件,这样可以获得最快的结果(至少在我的测试中)。

这是一个很好的评论。阅读后,我重新编写了我的CSV文件。现在导入所需的时间为1分20秒。导入完成,用时1分22秒172毫秒。 已导入: 1591048个节点 21449876个关系 71531032个属性 峰值内存使用量:1.048GiB - daydreamer

0

看看我为压力测试编写的批量导入器:

https://github.com/graphaware/neo4j-stress-test

我同时使用了neo4j索引和内存映射来连接两个提交。这种方法非常快速,并且适用于neo4j的所有版本。

忽略测试,直接获取批量导入工具。


谢谢分享。我会去看一下。同时,你能分享一些数据吗?比如说你用这个工具在多长时间内加载了多少数据?(我问这个是因为我时间有点紧迫,所以在尝试之前,我想确保这些数字至少是合理的)。再次感谢。 - panache
如果你运行测试,其中一个将下载一个示例数据集并导入它。我能够在不到15分钟的时间内导入超过3m个节点。但是时间也取决于您的测试环境(CPU、SSD或磁盘、RAM等)。 - Alessandro Negro
Alessandro,他使用Neo4j BatchInserter,对吧?性能还可以,但可扩展性不太好。但如果它对于特定的用例足够快,那么绝对是一种替代方案。 - Mattias Finné
完美的,让我知道如何做到这一点,以便我可以概括它。 - Alessandro Negro
关于可扩展性,你是什么意思? - Alessandro Negro
仅仅是因为导入工具在导入的数据集接近数十亿甚至更大时具有更好的可扩展性。 - Mattias Finné

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接