spark utils从hive 生成sst,遇到没有属性的边失败

  • nebula 版本:2.0.1
  • exchange:spark utils是4月21号从gitee master分支上同步下来,自己编译的。commit id: 5fe3171b9b5b29bc60d470aa3f1e751b65c3b988
  • 部署方式: docker-comose
  • 是否为线上版本:N
  • 硬件信息
    • 磁盘: ssd
  • 问题的具体描述

利用spark utils 将数据从hive表导出到sst文件。当导出的边只包含起点和终点的时候,spark报java.nio.BufferOverflowException。

以下是一部分application.conf,我放了两个edge配置。唯一区别是
第一个edge有属性(fields: [types]),这时候导出成功
第二个没有任何属性,导出失败。

{
     ## 以下配置,导出sst成功
      name: edge1
      type: {
        source: hive
        sink: sst
      }

      exec: "select id_src, id_dst, types from edge_table_1"

      fields: [types]
      nebula.fields: [types]

      source: {
        field: id_src
      }
      target: {
        field: id_dst
      }
      partition: 3
    },
    {
     ## 以下配置,导出sst失败
      name: edge2
      type: {
        source: hive
        sink: sst
      }

      exec: "select id_src, id_dst from edge_table_1"

      fields: []
      nebula.fields: []

      source: {
        field: id_src
      }
      target: {
        field: id_dst
      }
      partition: 3
    }

错误日志:

21/04/26 14:51:03 ERROR executor.Executor: Exception in task 1.3 in stage 11.0 (TID 98)
java.nio.BufferOverflowException
	at java.nio.Buffer.nextPutIndex(Buffer.java:527)
	at java.nio.HeapByteBuffer.putLong(HeapByteBuffer.java:423)
	at com.vesoft.nebula.encoder.RowWriterImpl.finish(RowWriterImpl.java:815)
	at com.vesoft.nebula.encoder.NebulaCodecImpl.encode(NebulaCodecImpl.java:200)
	at com.vesoft.nebula.encoder.NebulaCodecImpl.encodeEdge(NebulaCodecImpl.java:175)
	at com.vesoft.nebula.exchange.processor.EdgeProcessor$$anonfun$process$1$$anonfun$apply$1.apply(EdgeProcessor.scala:204)

感谢你的提问,我们本地复现下,还有生成 sst 我们还没发版本,等我们测试稳定你再用比较好。

1 个赞

我知道。我现在在评估从neo4j转到nebula的可行性。每天全量导入的边和顶点大概在29亿。非sst方式太慢,所以当个小白鼠,测一下你们未发布的sst

可以的,欢迎你的反馈。

你用的nebula-spark 基于的 java client 是什么版本的?假如是 2.0.0的话,那么你需要自己编译下 java-client,这个问题是在master上面fixed

用了最新的java client,跑成功了

今天把这个配置放到生产跑,还是报BufferOverflowException。这个问题还是存在。

你生产环境用的java client还是2.0.0的吧,你确认下代码是你自己打的jar包吗

现在我打包用的client是2.0.0-ga分支拉的最新版本。

如果client用master分支,那spark-utils编译有问题。比如 client里面com.vesoft.nebula.meta.PropertyType 在2.0.0-ga分支下,是class,但是到master 分支,变成enum了。这个导致spark utils 里面编译失败

你可以将Java client的代码 checkout 到 a507f3a14ab7509ab1e2d2d508c678123d20e4b1,然后再打包给 spark util 用

还是不行。编译spark utils报错:

[ERROR] /Users/xuhuijun/git/nebula/nebula-spark-utils/nebula-exchange/src/main/scala/com/vesoft/nebula/exchange/processor/Processor.scala:115: error: type mismatch;
[INFO] found : com.vesoft.nebula.meta.PropertyType(DATETIME)
[INFO] required: Int
[INFO] case PropertyType.DATETIME => {
[INFO] ^
[ERROR] /Users/xuhuijun/git/nebula/nebula-spark-utils/nebula-exchange/src/main/scala/com/vesoft/nebula/exchange/processor/Processor.scala:152: error: type mismatch;
[INFO] found : com.vesoft.nebula.meta.PropertyType(TIMESTAMP)
[INFO] required: Int
[INFO] case PropertyType.TIMESTAMP => {

java client 最新因为更新了依赖的第三方库,所以很多数据类型变了,spark-util 还没开始适配,所以编译不过,然后你的 java client 只要用 4 月 22 日之前的代码,那个更新代码是不会合进去的。我觉得你代码应该没有checkout 对,或者你到你下载的 java client源码下面 执行下git log 截图贴出来。

image

或者你能打个包给我吗?

master 用的版本是snapshot,你的 spark util 依赖的版本有换成snapshot 吗? 或者我更新到 maven 的 snapshot 仓库里,你等下用 maven 的。
https://oss.sonatype.org/content/repositories/snapshots/com/vesoft/client/2.0.0-SNAPSHOT/