常见问题和故障排除
一般问题
此软件是否与 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.Append
或 SaveMode.Overwrite
中的一种。
我们正在努力全面支持 Spark 3 上的所有保存模式。
我收到 NoClassDefFoundError 或 ClassNotFoundException 错误。我该怎么办?
您可能会遇到以下类型的错误之一:
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 以获取更多信息。