常见问题和故障排除

一般问题

此软件是否与 Morpheus 或 Apache Spark 版 Cypher (CAPS) 相关联?

不。两者之间没有共享代码或方法,它们采用了非常不同的方法。Apache Spark 版 Cypher®/Morpheus 采取了提供一个解释器的方法,该解释器可以在 Spark 环境中执行 Cypher 查询,并为 Spark 提供了一个原生的图表示。相比之下,此连接器不提供该功能,而是专注于在 Neo4j 和 Spark 之间进行读写操作。通过此连接器,所有 Cypher 代码都严格在 Neo4j 内部执行。Spark 环境仍然以 DataFrame 的形式运行,并且此连接器不提供用于 Spark 的图 API 原语。

如何加快写入 Neo4j 的速度?

Spark 连接器以批处理方式将数据写入 Neo4j。Neo4j 是一个事务性数据库,所有修改都在事务中进行。这些事务反过来会产生开销。

提高写入性能的两种最简单方法如下:

  • 您可以增加批处理大小(选项 batch.size)。批处理越大,写入所有数据所需的事务越少,产生的事务开销也越少。

  • 确保您的 Neo4j 实例有充足的可用堆内存和适当大小的页缓存。较小的堆内存会导致您无法提交大批量数据,从而减慢整体导入速度。

为获得最佳性能,请确保您熟悉操作手册中的内容。

重要的是要记住,Neo4j 的写入是纵向扩展,读取是横向扩展的。在因果集群模型中,只有集群领导者(1 台机器)才能接受写入。因此,请专注于在您的集群领导者上获取最佳硬件和性能,以最大化写入吞吐量。

为什么返回的列顺序与我在查询中指定的顺序不一致?

很遗憾,这是一个已知问题,存在于 Neo4j 3.x 和 Neo4j 4.0 中。从 Neo4j 4.1 开始,返回的顺序将与 return 语句中指定的顺序一致。

在哪里可以获得帮助?

Neo4j 社区网站是提问、与其他使用连接器的用户交流以及获得 Neo4j 专家帮助的好地方。您也可以在Neo4j Discord 频道中提问。

错误

我的写入因死锁异常而失败。我该怎么办?

在某些情况下,Neo4j 会因为死锁异常(您可能会在堆栈跟踪中看到)而拒绝写入事务。

这篇 Neo4j 知识库文章描述了这个问题。

通常,这是由于写入 Neo4j 时并行度过高导致的。例如,当您写入关系 (:A)-[:REL]→(:B) 时,这会在数据库中对这两个节点创建“锁”。如果同时有其他线程频繁尝试写入这些节点,可能会导致死锁异常并使事务失败。

通常,解决方案是在将 DataFrame 写入 Neo4j 之前对其进行重新分区,以避免多个分区写入锁定相同的节点和关系。

我遇到了类似 UTF8String cannot be cast to Long 的类型转换错误。解决方案是什么?

您可能会遇到以下错误或类似的、具有不同类型的错误:

java.lang.ClassCastException: org.apache.spark.unsafe.types.UTF8String cannot be cast to java.lang.Long

这通常是由于同一节点标签上的字段具有不同的类型造成的。您可以通过安装 APOC 来解决此问题:这会消除错误,但该字段的所有值都将转换为 String 类型。发生这种情况是因为 Spark 不是无模式的,并且需要每个列始终具有自己的类型。

您可以在此处阅读更多信息。

我收到错误 TableProvider implementation org.neo4j.spark.DataSource cannot be written with ErrorIfExists mode, please use Append or Overwrite modes instead。我该怎么办?

如果您在尝试写入 Neo4j 时收到此错误,请注意当前版本的连接器不支持 Spark 3 上的 SaveMode.ErrorIfExists 模式,而这是默认的保存模式。因此,请将保存模式更改为 SaveMode.AppendSaveMode.Overwrite 中的一种。

我们正在努力全面支持 Spark 3 上的所有保存模式。

我收到 NoClassDefFoundErrorClassNotFoundException 错误。我该怎么办?

您可能会遇到以下类型的错误之一:

NoClassDefFoundError: org/apache/spark/sql/sources/v2/ReadSupport
Caused by: ClassNotFoundException: org.apache.spark.sql.sources.v2.ReadSupport
java.lang.NoClassDefFoundError: scala/collection/IterableOnce
Caused by: java.lang.ClassNotFoundException: scala.collection.IterableOnce

这意味着您的 Spark 版本与连接器上的 Spark 版本不匹配。请参考此页面了解您需要的版本。

我收到错误 Failed to invoke procedure gds.graph.create.cypher: Caused by: java.lang.IllegalArgumentException: A graph with name [name] already exists。我该怎么办?

在使用 GDS 库创建新图时,可能会发生这种情况。这里的问题是查询第一次运行是为了提取 DataFrame 模式,然后再次运行是为了获取数据。

为避免此问题,您可以使用用户定义模式方法。

Databricks 设置

连接到 Aura 时我遇到了 SSL 握手错误。

从 Databricks 连接的 Aura 客户可能会遇到 SSL 握手错误,这是由于 Databricks 的自定义 Java 安全设置移除了对某些加密密码的支持。

请参阅 Aura 支持文章使用 Databricks 连接到 Aura 以获取更多信息。

© . All rights reserved.