Apache spark 如何以自动化方式导出大型Neo4j数据集进行分析

Apache spark 如何以自动化方式导出大型Neo4j数据集进行分析,apache-spark,neo4j,cypher,bigdata,Apache Spark,Neo4j,Cypher,Bigdata,关于Neo4j的使用,我遇到了一个技术挑战,这让我困惑了一段时间。我的组织使用Neo4j为客户交互模式建模。该图的大小已增长到约200万个节点和700万条边。所有节点和边都有5到10个元数据属性。每天,我们都将所有客户的数据从Neo4j导出到一系列执行业务逻辑的python流程 我们最初的数据导出方法是使用分页的密码查询来提取我们需要的数据。对于每个客户节点,cypher查询必须收集许多类型的周围节点和边缘,以便在必要的上下文中执行业务逻辑。不幸的是,随着数据的大小和密度的增加,这些分页查询开始

关于Neo4j的使用,我遇到了一个技术挑战,这让我困惑了一段时间。我的组织使用Neo4j为客户交互模式建模。该图的大小已增长到约200万个节点和700万条边。所有节点和边都有5到10个元数据属性。每天,我们都将所有客户的数据从Neo4j导出到一系列执行业务逻辑的python流程

我们最初的数据导出方法是使用分页的密码查询来提取我们需要的数据。对于每个客户节点,cypher查询必须收集许多类型的周围节点和边缘,以便在必要的上下文中执行业务逻辑。不幸的是,随着数据的大小和密度的增加,这些分页查询开始花费太长的时间而变得不实用

我们当前的方法使用一个定制的Neo4j过程来迭代节点,收集必要的周围节点和边缘,序列化数据,并将其放置在Kafka队列中供下游使用。这种方法工作了一段时间,但现在需要足够长的时间,因此它也变得不切实际,特别是考虑到我们预期图形的大小将增长一个数量级

我尝试过和项目,但它们都不能提供我们需要的查询和数据传输速度

我们目前运行在一个具有32GB内存和8个内核的Neo4j实例上。集群是否有助于缓解此问题


有人对如何执行这种数据导出有什么想法或技巧吗?如果您能深入了解这个问题,我们将不胜感激

据我所知,Neo4j不支持水平缩放,所有数据都存储在单个节点中。要使用Spark,您可以尝试将图形存储在2+个节点中,并从这些单独的节点加载数据集的部分,以“模拟”并行化。我不知道你们引用的两个连接器是否都支持它

但正如在你的问题评论中所说的,也许你可以尝试另一种方法。一个想法:

  • 找到一个表示训练模型所需的所有内容的数据结构
  • 将这种“展平”图存储在某个键值存储中(Redis、Cassandra、DynamoDB…)
  • 现在,如果图表中有变化,请将消息推送到卡夫卡主题
  • 在(=仅对受更改影响的图形分支进行更新,无需导出整个图形或同时更改键值存储,但很可能会导致逻辑重复)之后,添加更新图形和键值存储中数据的使用者
  • 使您的模型直接查询键值存储

  • 它还取决于数据更改的频率、图形的深度和广度?

    Neo4j Enterprise支持群集,您可以使用因果群集功能,根据需要启动任意数量的读取副本,在读取副本上并行运行查询,请参阅此链接:

    是否确实需要导出?您是否尝试过使用neo4j Python驱动程序(如)直接在neo4j DB上执行业务逻辑?不幸的是,cypher无法提供这种逻辑。我们已经训练了需要访问数据的分类器和模型,几乎不需要在Cypher中执行业务逻辑。您可以使用驱动程序获取纯Python编写的业务逻辑所需的数据,我们需要的数据或多或少涉及数据库中的所有数据。而且每个查询之间都有大量的数据重叠,这使得单个查询的效率远远低于操纵它的数据导出和应用程序逻辑。外部文档缓存可能会有很大的帮助,但我们需要经常重新构建和处理整个数据库。我不是Neo4j专家,所以请恕我直言,但如果您的应用程序需要在数据库中进行分页(您可以使用cypher查询执行逻辑)考虑其他存储方法是否值得?你知道这是否超出了Neo4j构建的交互模式吗?谢谢,每当相关节点更新时,我都会在Neo4j触发器中将一个扁平文档推送到elasticsearch