nebula-exchange 生成sst导入文件中文乱码

nebula 版本:2.0.1
部署方式(分布式):是
是否为线上版本:N
硬件信息
磁盘( SSD)
CPU、内存信息
问题的具体描述

nebula-exchange :
nebula-exchange-2.0.0.jar

现象:
HIVE表中有中文的情况下 ,转化生成sst 文件 导入sst到nebula之后
发现中文字段 以及后面的字段 错位或者出现乱码的情况。

配置文件里面没配置chartset

(root@nebula) [(none)]> SHOW CHARSET
±--------±----------------±------------------±-------+
| Charset | Description | Default collation | Maxlen |
±--------±----------------±------------------±-------+
| “utf8” | “UTF-8 Unicode” | “utf8_bin” | 4 |
±--------±----------------±------------------±-------+
Got 1 rows (time spent 50295/50682 us)

curl localhost:19669/flags |grep char
default_charset=“utf8”

19559 19779这2个都没有

@nicole 看看呢

这个功能还没有放出呢,你要使用的话 用master分支上的SNAPSHOT版本吧。

是生成sst 的时候错位了 还是 导入的时候错位的?
请问下 具体是什么功能,大约啥时候开放出来

你可以使用Nebula的db_dump工具查看下sst文件的内容。
大概率是生成的时候错位了,因为你用的版本中编码数据时 buffer 会出现错位。

你现在要用的话可以自己编译spark-utils这个repo的master分支 或者 在这里下载SNAPSHOT版本 Index of /repositories/snapshots/com/vesoft/client

谢谢回复,我用这个新版本测试下

您好。是否有已经编译好的包直接下载,这个spark-utils依赖的东西太多,一直没有被成功编译。问题一直被搁置了 :sweat_smile:

你看这个回复啊,我已经把下载地址告诉你了

好的 我用这个试一试
https://oss.sonatype.org/content/repositories/snapshots/com/vesoft/nebula-exchange/2.0-SNAPSHOT/nebula-exchange-2.0-20210525.035522-2.jar

执行的时候报错:

ERROR executor.Executor: Exception in task 15.0 in stage 11.0 (TID 706)
java.lang.IllegalArgumentException: No enum constant com.vesoft.nebula.meta.PropertyType.6
at java.lang.Enum.valueOf(Enum.java:238)
at com.vesoft.nebula.meta.PropertyType.valueOf(PropertyType.java:14)
at com.vesoft.nebula.exchange.processor.Processor$class.extraValueForSST(Processor.scala:79)
at com.vesoft.nebula.exchange.processor.EdgeProcessor.extraValueForSST(EdgeProcessor.scala:44)
at com.vesoft.nebula.exchange.processor.EdgeProcessor$$anonfun$process$1$$anonfun$apply$1$$anonfun$2.apply(EdgeProcessor.scala:208)
at com.vesoft.nebula.exchange.processor.EdgeProcessor$$anonfun$process$1$$anonfun$apply$1$$anonfun$2.apply(EdgeProcessor.scala:206)
at scala.collection.TraversableLike$WithFilter$$anonfun$map$2.apply(TraversableLike.scala:683)
at scala.collection.immutable.List.foreach(List.scala:392)
at scala.collection.TraversableLike$WithFilter.map(TraversableLike.scala:682)
at com.vesoft.nebula.exchange.processor.EdgeProcessor$$anonfun$process$1$$anonfun$apply$1.apply(EdgeProcessor.scala:206)
at com.vesoft.nebula.exchange.processor.EdgeProcessor$$anonfun$process$1$$anonfun$apply$1.apply(EdgeProcessor.scala:117)
at scala.collection.Iterator$$anon$11.next(Iterator.scala:410)
at scala.collection.Iterator$$anon$11.next(Iterator.scala:410)
at scala.collection.Iterator$$anon$11.next(Iterator.scala:410)
at scala.collection.Iterator$$anon$12.nextCur(Iterator.scala:435)
at scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:441)
at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:409)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage3.sort_addToSorter_0$(Unknown Source)
at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage3.processNext(Unknown Source)
at org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43)
at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$13$$anon$1.hasNext(WholeStageCodegenExec.scala:636)
at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:409)
at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:409)
at scala.collection.Iterator$class.foreach(Iterator.scala:891)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1334)
at com.vesoft.nebula.exchange.processor.EdgeProcessor$$anonfun$process$3.apply(EdgeProcessor.scala:225)
at com.vesoft.nebula.exchange.processor.EdgeProcessor$$anonfun$process$3.apply(EdgeProcessor.scala:220)
at org.apache.spark.rdd.RDD$$anonfun$foreachPartition$1$$anonfun$apply$28.apply(RDD.scala:980)
at org.apache.spark.rdd.RDD$$anonfun$foreachPartition$1$$anonfun$apply$28.apply(RDD.scala:980)
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:2101)
at org.apache.spark.SparkContext$$anonfun$runJob$5.apply(SparkContext.scala:2101)
at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:90)
at org.apache.spark.scheduler.Task.run(Task.scala:123)
at org.apache.spark.executor.Executor$TaskRunner$$anonfun$10.apply(Executor.scala:408)
at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1360)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:414)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

也遇到同样的问题,nebula版本2.0.0, 已经采用了最新的 nebula-exchange-2.0-SNAPSHOT.jar, 输入为 hdfs上的json文件,输出为 hdfs 上的 sst文件,加载后也是中文乱码

版本不匹配,你用的exchange是哪个日期的,我刚发布一下最新的,你重新下载一下

1 个赞

我再试一下
https://oss.sonatype.org/content/repositories/snapshots/com/vesoft/nebula-exchange/2.0-SNAPSHOT/nebula-exchange-2.0-20210607.092740-3.jar

用ldb已经看到正确的utf8 数据了。但是从 nebula-console 里面就是查不出来,是什么原因呢?nebula使用的是2.0.0, exchange是最新的 nebula-exchange-2.0-SNAPSHOT.jar, 是nebula要用2.0.1吗?

./ldb --db=nebula/data/storage/nebula/1/data dump --hex |grep 3431303031
0x010500003431303031000000000000000002000000 ==> 0x080029A00000000000001A000000020000001C000000040000003431E5A49CE995BFE6A2A6E5A49A9B2D432B2AC40500
但console显示出来的只是一部分:对应的中文为 “夜长梦多” (E5 A4 9C E9 95 BF E6 A2 A6 E5 A4 9A)

你看看你track_name 字段类型是什么?这里应该是长度不够,显示不全吧
如果是string类型,或者fixed_string(12)应该可以显示全的

track_name的类型是string
image

新版本的解决了乱码问题

另外 INGEST sst文件大小为0的文件 会导致INGEST失败
这个问题最好能修复下 有时候不可避免的会生成这种文件

这里处理 中文string 的序列化时应该有问题吧?


应该是 strList.get(strNum).getBytes().length ?