常见问题解答和故障排除
常见问题
此软件是否与 Morpheus 或 Cypher for Apache Spark(全部大写)相关联?
不。两者之间没有共享代码或方法,它们采取了截然不同的方法。Cypher® for Apache Spark/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 的并行度过高造成的。例如,当您写入关系 (:A)-[:REL]→(:B)
时,这将在数据库中对两个节点都创建一个“锁”。如果其他线程同时尝试对这些节点进行过于频繁的写入,则会导致死锁异常,并导致事务失败。
通常,解决方案是在将 DataFrame 写入 Neo4j 之前对其进行重新分区,以避免多个分区写入锁定相同的节点和关系。
我遇到了类似于“UTF8String 无法转换为 Long”的类型转换错误。解决方案是什么?
您可能会遇到以下错误或类似错误,其中类型不同
java.lang.ClassCastException: org.apache.spark.unsafe.types.UTF8String cannot be cast to java.lang.Long
这通常是由于同一节点标签上的字段具有不同的类型造成的。您可以通过安装 APOC 来解决此问题:这将消除错误,但该字段的所有值都将转换为字符串。发生这种情况是因为 Spark 不是无模式的,它需要每一列始终都有自己的类型。
您可以阅读更多内容。
我遇到了错误“TableProvider 实现 org.neo4j.spark.DataSource 无法使用 ErrorIfExists 模式写入,请改用 Append 或 Overwrite 模式”。我该怎么办?
如果您在尝试写入 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 版本不匹配。请参阅此页面以了解您需要哪个版本。
我遇到了错误“无法调用过程 gds.graph.create.cypher:原因:java.lang.IllegalArgumentException:名为 [name] 的图已存在”。我该怎么办?
这可能发生在使用 GDS 库创建新图时。这里的问题是查询第一次运行以提取 DataFrame 模式,然后再次运行以获取数据。
要避免此问题,您可以使用用户定义的模式方法。
Databricks 设置
我在连接到 Aura 时遇到了 SSL 握手错误。
从 Databricks 连接的 Aura 客户可能会遇到 SSL 握手错误,因为 Databricks 的自定义 Java 安全设置取消了对某些加密密码的支持。
有关更多信息,请参阅 Aura 支持文章使用 Databricks 连接到 Aura。