logo
咨询企业版

技术分享

关于 NebulaGraph Java,你可能遇到的二三事

导读:NebulaGraph Java 是一款 Java 语言的客户端,可以连接、管理 NebulaGraph 图数据库,此外,NebulaGraph 还拥有完善的 Java 系列生态工具,包括 NebulaGraph 官方提供的 NebulaGraph Exchange、NebulaGraph Spark Connector、NebulaGraph Flink Connector,以及由社区小伙伴们贡献并维护的 ngbatis、 java-jdbc、java-orm 等等。 本文汇总了大家在使用 NebulaGraph 时可能会遇到的 Java (官方版)相关问题,先码再看,会有用到的那天~

01 Java Client

Q:Method Name xxx not found

A:检查端口配置,基本是因为 Metad、Storaged、Graphd 端口配混。 或者是高版本的客户端(>=2.6)连接了低版本的服务端(<2.6)

Q:IOErrorException: All servers are broken

A: 检查 Nebula Graphd 服务是否启动,检查客户端与服务端网络是否连通

💡说明:该错误信息出现的原因是,客户端无法连接配置的 graphd 地址。

Q:get storage client error, java.util.NoSuchElementException: Unable to activate object

A:首先确认是否是虚拟化部署,如果是则需要把所有 stroaged host 和端口映射出来。

💡说明:因为 storaged client 使用的 storaged 地址是通过 metad 获取的,metad 返回给客户端的地址是容器内的地址,外部访问不了。

Q:metad 连接不上,com.facebook.thrift.transport.TTransportException:java.net.ConnectException: Connection refused (Connection refused)

A:首先确认服务状态,其次检查网络连通性,最后是否是容器化部署,如果是,则可以只配置 meta leader 的服务地址。

💡说明: 因为 metad 服务只有 leader 才能进行读写请求, 当客户端传入多个 metad 地址,则客户端会随机挑选一个进行请求,根据响应结果返回的 leader host 再访问 metad leader, 此时 leader host 如果是容器内地址,无法访问。

有两种方式:1 是只配置 metad leader, 2 是把所有 metad host 和端口映射出来。

Q:java.net.SocketException: Broken pipe(Write failed)

A: 检查服务是否在使用中途挂掉; 检查网络是否存在波动(针对偶发现象)

💡说明:该错误出现原因是, socket 连接在数据传输过程中管道的一端断开。

Q:TProtocolException: The field 'code' has been assigned the invalid value -4

A: Nebula 服务端和客户端版本不兼容

💡说明:只存在于 2.6.0 版本之前

Q:TProtocolException: Excepted protocol id xxx

A: Nebula 服务端和客户端版本不兼容

💡说明:只存在于 2.6.0 版本之前

Q:client 执行语句时,语句中的中文内容乱码

A:该问题存在于3.7.0版本之前,可以更新client 版本到3.7.0或3.7.0以上。https://github.com/vesoft-inc/nebula-java/releases/tag/v3.7.0

Q:3.x client 执行语句时,报错: session not found

A: session 在服务端过期失效。 业务端请重新获取 session.

02 NebulaGraph Exchange and NebulaGraph Connector

Q:Exchange 导入hive 数据时,Exception in thread "main" org.apache.spark.sql.AnalysisException: Table or view not found

A: 检查 Exchange 的提交命令中是否遗漏了参数 -h;检查 hive table 和执行语句是否配置正确

Q:Exchange导入时,ClassNotFoundException: com.vesoft.nebula.exchange.Exchange

A:

  1. 如果是在 Yarn 模式下,则使用该命令 (github readme、使用文档、QA文档都有说明)。
$SPARK_HOME/bin/spark-submit --class com.vesoft.nebula.exchange.Exchange \
--master yarn-cluster \
--files /path/application.conf \ 
--conf spark.driver.extraClassPath=/path_for_exchange \
--conf spark.executor.extraClassPath=/path_for_exchange \
nebula-exchange-3.0.0.jar \
-c application.conf

说明:
--files: 表示将该文件上传hdfs。 这是spark参数
--conf spark.driver.extraClassPath: 配置exchange jar包所在目录。 这是spark参数
--conf spark.executor.extraClassPath:配置exchange jar包所在目录。 这是spark参数
-c:exchange程序参数
  1. 如果非 yarn 模式 则确认当前目录下是否有 Exchange 的 jar 包以及 jar 包大小是否正常。

#

Q:Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.xxx(java.lang.NoClassDefFoundError 错误也是 jar 包冲突)

A: guava 包冲突。 3.x NebulaGraph 要么替换 spark_home/jars 目录下的 guava 版本为 14.0, 要么使用最新的 Exchange 包(SNAPSHOT 版本)或者 3.6.0版本。

Q:NoClassDefFoundError: scala/Product$class

A: scala 版本冲突。 spark2.4 支持 scala2.11 和 scala2.12; spark2.2 只支持scala 2.11; spark 3.x 只支持 scala2.12

Q:导入数据时出现中文乱码

A:导入的 spark-submit 命令中增加配置:

--conf spark.driver.extraJavaOptions=-Dfile.encoding=utf-8
--conf spark.executor.extraJavaOptions=-Dfile.encoding=utf-8

Q:Hive Schema version xxx does not match metastore's schema version 2.1.0 Metastore is not upgraded or corrupt

A:

  • 将 Hive 环境中存储 Hive metastore 信息的 Mysql Version 信息更新为 spark 中使用的 metastore 版本: update hive.VERSION set SCHEMA_VERSION="2.1.0" where VER_ID=1

  • 同时在 Hive 环境的 hive-site.xml 中增加如下配置,并重启 Hive

<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>

💡说明:原因是 Hive 环境中配置的 metastore schema 版本和 spark 使用的 metastore 版本不一致。

Q:Can not define any other configs when kafka exists

A: 当存在 kafka 配置时, kafka 配置之后不允许再配置其他数据源的导入。 因为 kafka 是流式数据,任务会一直停留等待 kafka 的数据,不会执行后面的t ag/edge 导入。所以 kafka 导入最好是一个 tag 一个配置文件。

Q:导入 Mysql 或者其他数据库,提示找不到 driver,java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver

A: 需要把数据库的 driver 驱动放到 spark_home/jars 目录下。

根据数据库版本去下对应的驱动(mysql-connector-java-xxx.jar),如 mysql 驱动下载地址:https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.33/

Q:Exchange 或者 Connector 数据导入少数据

A:

  1. 首先查看导入过程是否有写入失败,根据下面日志查找:
  • Exchange 的日志:

  • Client-Import: batchSuccess.{tag/edge}

  • Client-Import: batchFailure.{tag/edge}

  • Spark connector 的日志:failed to write xxx

  • Flink connector 的日志: write data failed: xxx

  1. 确认导入数据是否存在重复

  2. show stats 之前是否重新 submit job stats

Q:java.util.NoSuchElementException: key not found: xxx

A: 确认 NebulaGraph 中是否有xxx这个属性存在。

Q:IOErrorException:java.net.SocketTimeoutException: Read timed out

A:导入速度过快或者数据请求量过大导致请求超时未响应。 此时要调小 batch size、调小 spark partition 数, 同时调大配置中的 timeout.

Q:Queries with streaming sources must be executed with writeStream.start()

A:

  1. 确认使用的 Exchange 版本。Exchange 3.4.0 版本 不支持流式数据导入,因为该版本中加了一些数据统计的操作,流式数据是不能进行 count 统计的。 所以请替换成 Exchange3.5.0 版本。

  2. 确认导入模式,流式数据不支持 SST 导入

Q: vim 中的^C 分隔符八进制表示是\003, 在 exchange 中如何配

A: 要配成分隔符对应的 unicode 十六进制的字符: '\u0003' . 其他分隔符同理,搜一下 unicode 十六进制的表示。

Q:3.x exchange 导入时 ErrorHandler 报错:Java.lang.UnsupportedOperationException: Append is not supported by ChecksumFileSystem

A: 导入过程有写入失败数据,失败语句在记录到 error.path 时报错。 原因是:error.path 配置了 hdfs 路径,但用户 hdfs 不允许 append 操作。

解决: 要么更改 hdfs 配置允许 append(不推荐); 要么将 error.path 配置成本地文件,file:///xxx/xxx

此外,根本原因是存在写入失败的语句,要先排查为什么会写入失败。

03 其它

Q:Your current spark version ${sparkVersion} is not supported by the current NebulaGraph Exchange

A:Spark 环境版本和所用的工具支持的 Spark 版本不一致。 具体版本对应关系在github readme 中有表格说明。

04 Ending

本文的问题汇总,部分问题来自 NebulaGraph 论坛,如果你在本文中未检索到相关问题,可以结合文档+论坛解决。

🔍论坛:https://discuss.nebula-graph.com.cn/

🔍文档:https://docs.nebula-graph.com.cn/3.8.0/