技术分享
关于 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:
- 如果是在 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程序参数
- 如果非 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:
- 首先查看导入过程是否有写入失败,根据下面日志查找:
Exchange 的日志:
Client-Import: batchSuccess.{tag/edge}
Client-Import: batchFailure.{tag/edge}
Spark connector 的日志:failed to write xxx
Flink connector 的日志: write data failed: xxx
确认导入数据是否存在重复
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:
确认使用的 Exchange 版本。Exchange 3.4.0 版本 不支持流式数据导入,因为该版本中加了一些数据统计的操作,流式数据是不能进行 count 统计的。 所以请替换成 Exchange3.5.0 版本。
确认导入模式,流式数据不支持 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/