参数调优

为了从 Neo4j 读取(尤其是写入)获得最佳性能,请确保您已完成此清单

调整批次大小

数据写入 Neo4j 是以批次形式进行事务性操作的;如果您想写入 100 万个节点,您可能会将其分成 40 个批次,每个批次 25,000 个。连接器的批次大小由 batch.size 选项控制,并设置在一个相当低、保守的水平。这对于许多应用程序来说可能太低,并且可以通过更好地了解您的数据来改进

批次大小的权衡如下

  • 批次大小越大,整体数据摄取性能越好,因为这意味着更少的事务和更少的总体事务开销。

  • 当批次大小过大,导致 Neo4j 的堆内存无法容纳时,可能会导致服务器出现内存不足错误并导致故障。

当您使用尽可能大的批次大小,同时保持在服务器可用内存范围内时,可以获得最佳写入吞吐量。

不可能选择一个适用于所有人的单一批次大小,因为事务占用的内存量取决于属性和关系的数量以及其他因素。一个好的通用积极尝试值约为 20,000——但如果您的数据量小,或者服务器内存充足,您可以增加这个数字。如果数据库服务器较小,或者您正在推送的数据包含许多大型属性,则降低此数字。

调整 Neo4j 内存配置。

Neo4j 操作手册中,给出了关于如何设置服务器堆和页缓存大小的重要建议。对于 Spark 而言,重要的是以下几点

  • 堆内存影响事务的大小。堆越大,您可以使用的批次大小就越大。

  • 页缓存影响数据库中在任何给定时间驻留在 RAM 中的数据量。页缓存远小于数据库会导致性能下降。

调整并行度

Spark 本质上是关于分区和并行性的;常用的技术是将一批数据分成多个分区,供每台机器并行处理。在 Neo4j 中,并行性工作方式截然不同,我们将在本章中进行描述。

Neo4j 中的写入并行度

对于大多数写入 Neo4j 的操作,强烈建议将您的 DataFrame 重新分区到仅一个分区。

在 Neo4j 中写入节点和关系时

  • 写入关系会锁定两个节点。

  • 写入节点会锁定该节点。

此外,在 Neo4j 因果集群模型中,只有集群领导者才能写入数据。由于 Neo4j 中的写入是垂直扩展的,因此实际并行度受限于领导者上的核心数量。

建议对写入使用单个分区的原因是,它消除了写入之间的锁争用。假设一个分区正在写入

(:Person { name: "Michael" })-[:KNOWS]->(:Person { name: "Andrea" })

而另一个分区正在写入

(:Person { name: "Andrea" })-[:KNOWS]->(:Person { name: "Davide" })

关系写入锁定了 "Andrea" 节点——无论如何这些写入都无法并行进行。因此,如果线程必须等待彼此的锁,您可能无法通过增加并行度来提升性能。在并行度过高的极端情况下,Neo4j 可能会因锁争用错误而拒绝写入。

数据集分区

如果您已正确分区数据以避免 Neo4j 锁,则可以使用与 Neo4j 服务器核心数量相同数量的分区。

上述“一个分区”规则有一个例外:如果您的数据写入提前分区以避免锁,您通常可以向 Neo4j 发送与服务器核心数量相同的写入线程。假设我们想写入一个很长的 :Person 节点列表,并且我们知道它们通过人员 id 是唯一的。我们可以在四个不同的分区中将这些数据流式传输到 Neo4j,因为不会有任何锁争用。

调整模式采样

由于采样过程可能开销很大并影响数据提取作业的性能,因此正确调整采样参数至关重要。

APOC 采样

如果安装了 APOC,模式推断将使用 apoc.meta.nodeTypePropertiesapoc.meta.relTypeProperties 过程。

您可以使用 apoc.meta.nodeTypePropertiesapoc.meta.relTypeProperties 选项来调整两者的 sample 参数。例如

df.read
  .format(classOf[DataSource].getName)
  .option("labels", ":Product")
  .option("apoc.meta.nodeTypeProperties", """{"sample": 10}""")
  .load()

该选项支持除以下所有配置参数

  • apoc.meta.nodeTypePropertiesincludeLabels,因为标签由 labels 选项定义。

  • apoc.meta.relTypePropertiesincludeRels,因为关系由 relationship 选项定义。

自动采样

当未安装 APOC 或使用 query 选项时,连接器会从多个记录推断模式。

您可以调整 schema.flatten.limit 选项来增加或减少此数字。

© . All rights reserved.