apache-spark - 如何以自动化方式导出大型 Neo4j 数据集进行分析
问题描述
我遇到了一个关于 Neo4j 使用的技术挑战,这让我有一段时间感到困惑。我的组织使用 Neo4j 对客户交互模式进行建模。该图已增长到大约 200 万个节点和 700 万条边的大小。所有节点和边都有 5 到 10 个元数据属性。每天,我们将所有客户的数据从 Neo4j 导出到一系列执行业务逻辑的 python 进程。
我们最初的数据导出方法是使用分页密码查询来提取我们需要的数据。对于每个客户节点,密码查询必须收集许多类型的周围节点和边,以便可以在必要的上下文中执行业务逻辑。不幸的是,随着数据的大小和密度的增长,这些分页查询开始花费太长时间而变得不实用。
我们当前的方法使用自定义 Neo4j 程序来迭代节点,收集必要的周围节点和边,序列化数据,并将其放在 Kafka 队列中以供下游使用。这种方法工作了一段时间,但现在花费的时间足够长,以至于它也变得不切实际,特别是考虑到我们预计图表的大小会增长一个数量级。
我已经尝试过cypher -for-apache-spark和neo4j-spark-connector项目,它们都无法提供我们需要的查询和数据传输速度。
我们目前在具有 32GB 内存和 8 个内核的单个 Neo4j 实例上运行。集群会帮助缓解这个问题吗?
有没有人对如何执行这种数据导出有任何想法或提示?任何对问题的见解将不胜感激!
解决方案
据我所知,Neo4j 不支持水平缩放,所有数据都存储在单个节点中。要使用 Spark,您可以尝试将图形存储在 2 个以上的节点中,并从这些单独的节点加载数据集的部分以“模拟”并行化。我不知道您引用的两个连接器是否都支持它。
但正如您问题的评论中所说,也许您可以尝试另一种方法。一个主意:
- 找到一个数据结构,代表你训练模型所需的一切。
- 将这种“扁平化”图存储在一些键值存储(Redis、Cassandra、DynamoDB ...)中
- 现在,如果图表发生变化,请将消息推送到您的 Kafka 主题
- 添加消费者在图表和键值存储之后直接更新数据(= 只更新受更改影响的图分支,无需导出整个图或同时更改键值存储但它很可能会导致重复逻辑)
- 让您的模型直接查询键值存储。
它还取决于您的数据更改频率,图表的深度和广度?
推荐阅读
- linux - 如何加载没有版本信息的 DSO?
- javascript - 嵌套 for 循环中的 Array.push() 导致父循环的最后一个值被推送
- microsoft-graph-api - 通过 /teams 创建团队突然忽略可见性:Private 并创建 Public Team
- c# - 如何在 OpenTK.Graphics.OpenGL4 中使用平面着色?
- ms-access - 规范化 - 如何在另一个表的多个字段中正确引用一个表中的列表?
- c - 当一个父进程用 C 语言编写一些字符串时要读取的多个子进程
- python - Plotly:如何为每个变量创建具有不同样式和颜色的线图?
- asp.net-core - 如何从资源文件中引用资源
- python - 如何将python列表拆分为不同长度的列表?
- python - 两个骰子的朴素贝叶斯方法