exchange 导入hive数据到nebula graphd错误日志全部乱码


看着这个日志 直接是乱码的

贴一下完整的,看下前面tag 和edge的, 你这个reimport的内容有可能是 error.output目录中原有的内容。

你也可以自己用sparksql读一下hive的数据,看是不是乱码, exchange内部没做啥编码或转换的

我用的是exchange2.5.1. 通过HIVE生成SST导入后,相关属性为乱码。且HIVE查询结果正常。请问怎么解决?
在space下执行命令show charset:

(root@nebula) [gan_test25]> show charset;
+---------+-----------------+-------------------+--------+
| Charset | Description     | Default collation | Maxlen |
+---------+-----------------+-------------------+--------+
| "utf8"  | "UTF-8 Unicode" | "utf8_bin"        | 4      |
+---------+-----------------+-------------------+--------+
Got 1 rows (time spent 402/1333 us)

界面查询结果如下图

那几个带问号的乱码的数据是中文么? Exchange 和Nebula是支持中文导入的,你要用spark-shell 看下读出来的hive中的数据是什么样子的。

没有问题的,我之前用importer导入没有问题。

importer是发送graph请求导入的,sst是直接生成底层的SST文件,不经过graph服务的。 我们测过sst导入是支持中文的, 你可以用Exchange 的client 模式导入试下,是否还是乱码。

试过了,还是乱码。

那就是Exchange读出来的数据就是乱码了, client模式不会对数据做任何编码和转码的。你可以在本地编译器debug 看一下,把断点打在Exchange 文件的这一行
val data = createDataSource(spark, tagConfig.dataSourceConfigEntry)

通过代码调试后,确实显示中文异常了,但是通过spark-shell,执行spark.sql终端显示是正常的,难不成包问题?

    extends ServerBaseReader(session, hiveConfig.sentence) {
  private[this] val LOG = Logger.getLogger(this.getClass)
  override def read(): DataFrame = {
    LOG.info("===============sentence:"+sentence)
    val data = session.sql(sentence)
    data.show(10)
    data
  }
}

异常如下:

你的Exchange是采用什么模式提交的, 你的spark 版本和hive meta版本与Exchang的版本一致么。

我修改了spark对应的CDH版本。目前测试结果是:
1.yarn-cluster提交session.sql乱码。(且提交时已指定Driver,Executor等编码)
2.yarn-client提交后生成SST过程中乱码,session.sql查询出的结果是正常的,但是在生成SST前后已经乱码了,我还在调试,都调哭了。。。 :joy::joy::joy:)

大神,这是我yarn client提交后调试日志。

------------update:
经过最终测试,Driver端正常展示,而Executor则乱码,查阅相关资料后已经指定编码,仍旧没有解决。请问这个有碰到类似问题么?

/bin/spark-submit --master yarn --deploy-mode client --class com.vesoft.nebula.exchange.Exchange  --files $CONFIG_FILE --conf spark.driver.extraJavaOptions="-Dfile.encoding=utf-8" --conf spark.executor.extraJavaOptions="-Dfile.encoding=utf-8"  --conf spark.serializer=org.apache.spark.serializer.JavaSerializer --conf spark.sql.shuffle.partitions=2 --conf "spark.executor.extraJavaOptions=-XX:MaxPermSize=1025M" --driver-java-options -XX:MaxPermSize=2048m --driver-memory 4g  --executor-memory 12g --executor-cores 8 --num-executors 4 --conf spark.driver.extraClassPath=/opt/cloudera/parcels/CDH/lib/spark/jars/guava-14.0.1.jar --conf spark.executor.extraClassPath=/opt/cloudera/parcels/CDH/lib/spark/jars/guava-14.0.1.jar debug_nebula-exchange-2.5.1.jar -c $CONFIG_FILE -h

查了资料看到是CDH集群中yarn也要加对应的编码配置:


参考资料:CDH在yarn上运行程序乱码_yarn中文乱码 cdh-CSDN博客

ps:如果你的spark配置目录下有copy hadoop的部分配置文件,注意也同步更改下

是的,这个帖子我也看到了,正在调试。

问题解决了,一直以为是我们这边的问题,整整调试CDH集群4个工作日。。。
RowWriterImpl这个类处理字符串转成字节有问题的。

这是你改之后的代码, 不应该直接将"UTF-8" 指定给getBytes, 你可以看一下getBytes()源码里面在encode时会基于运行时环境的file.encoding来决定采用那种编码。
在执行程序时,是可以去指定file.encoding是UTF-8还是GBK的。 还是要看下你的集群系统中的file.encoding 是不是非UTF_8的。

嗯嗯,很奇怪的问题,我通过spark.sql模拟你们核心程序然后进行打印,其客户端及节点编码都是UTF-8.但是用你们的程序client提交时是UTF-8,Executor 相关task都变为ANSI了,而我相关的系统,JDK,集群,运行时参数都设置了UTF-8,但是最终执行是还是ANSI。跑了,跑了,跑了,定位问题太费时间了,最终能正常展示就好。谢谢大神。 :joy: :joy: :joy:

:rofl: 解决问题了就好, 后续有时间也可以帮忙看下原因 贴上来,方便遇到相同问题的其他用户借鉴哈~