Exchange导入了很多无TAG的点

  • nebula 版本:3.0.0
  • Exchange版本:nebula-exchange_spark_2.4-3.0.0.jar
  • spark版本:2.3.0
  • 部署方式:分布式
  • 安装方式: RPM
  • 是否上生产环境:Y
  • 硬件信息
    • 磁盘 hdd
  • 问题的具体描述
    使用exchange导入hive表中的数据,
    spark-submit导入完成后,spark的info日志里没有任何报错
    hive中统计得到的数据量和nubula中的数据量不一致。少了7300条数据。
    删除数据以后,又进行了多次导入,一共4亿多条数据,每次都是缺少7300条。
    查看了一下reload文件,发现里面都是乱码

hive :select COUNT(distinct column1) from table1
nebula: submit job stats ;show stat
column1作为vid,统计得到的数据量不一致。

spark提交命令:

nohup spark-submit 
--master yarn 
--queue h1 
--conf spark.app.name="hive2nebula" 
--driver-java-options "-Xss256m -Dlog4j2.formatMsgNoLookups=true" 
--conf "spark.executor.extraJavaOptions=-Xss256m -Dlog4j2.formatMsgNoLookups=true" 
--driver-memory=10G 
--executor-memory=20G 
--num-executors=32 
--executor-cores=1 
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:/data/nebulagraphhdd/log4j.xml -Dfile.encoding=utf-8"
--conf "spark.executor.extraJavaOptions=-Dfile.encoding=utf-8"
--conf spark.dynamicAllocation.enabled=false 
--conf spark.sql.hive.convertMetastoreParquet=false 
--conf spark.sql.hive.convertMetastoreOrc=false 
--class com.vesoft.nebula.exchange.Exchange  /data/nebulagraphhdd/libs/nebula-exchange_spark_2.4-3.0.0.jar  -c   /data/nebulagraphhdd/hive2nebula.conf -h > hive2nebula.log 2>&1 &

NebulaExchange配置文件:hive2nebula.conf

{
  spark: {}
  nebula: {
    address: {
      graph: [
               略
            ]
      meta: [
            略
            ]
        }
    user: 略
    pswd: 略
    space: xxx
    connection {
      timeout: 120000
      retry: 3
        }
    execution {
      retry: 3
        }
    error: {
      max: 32
      output: /user/nebulagraphhdd/hive_phone_exchange_error
        }
    rate: {
      limit: 1024
      timeout: 10000
        }
    }


  tags: [
        {
      name: 号码
      type: {
        source: hive
        sink: client
            }
      exec: "select device_number,status_desc,cert_no_md5 from  table1 where month_id ='202412' and day_id='02'"
#仅展示部分字段,其实比这字段多
      fields: [status_desc,cert_no_md5]
      nebula.fields: [号码状态,证件号]
      vertex: {
        field: device_number
            }
	  #writeMode: INSERT
      batch: 256
      partition: 32
        }
		        
    ]
  edges: [
    ]
}

TAG是用中文进行的建模,仅展示部分字段,其实比这字段多

CREATE TAG IF NOT EXISTS 号码
(号码状态 String NULL COMMENT '',
 证件号  String NULL COMMENT ''
)
COMMENT = '';

位于HDFS上的reload文件截图:

我在reload文件中获得了一个insert vertex语句下的全部VID,然后在图库中查询,发现这些VID全都是存在的,但是没有任何属性,只有一个VID。
而且针对这其中任意一个VID

MATCH (v) WHERE id(v) == "13011833726"
RETURN labels(v);

进行查询,返回的tag是 【】 ,也就是没有TAG

使用Exchange 的reload重新导入,看到日志中全都导入失败了,

submit job stats
show stats

再次查询,发现图库中的数量也没有任何变化。

但是当我打开一个reload文件(一共有很多个reload文件),根据收集里面的VID,然后把vid对应hive库里面的数据重新配置成conf文件,再次使用exchange进行导入,结果就导入成功了

目前存在疑问的是:
为什么多次导入,都会有相同数量的数据导入不进去?
(其实是进去了,都是无TAG的点。只是无TAG的点不会被show stats统计到)
reload也进不去
但是可以发现这些失败的数据在图库中生成了仅有VID没有属性没有TAG的点
spark日志中只能看到失败的数量,看不到失败的原因
把reload中失败的数据单独配置成conf文件,就可以导入进去。

接下来我的处理思路是:
1.我把所有error_output目录下的所有xx.1,xx.2,xx.3这种类型的exchange失败时存储的文件中的VID全部都提取出来,单独写在Exchange的conf文件中执行导入,结果全都成功导入进去了。

所以现在的问题只剩下一个了:为什么多次导入,都会有相同数量的数据导入不成功,这些数据会被导入成无TAG的点。并且执行Exchange的reload也不会导入成功

你这里无 tag 的点大概率并不是导入点的时候生成的,而是导入边的时候生成的;
我不清楚 reload 文件里的语句是怎样的,按理这里的语句应该是失败的语句才对。

不过 3.0.0 之后的版本对 无 tag 的点做了一些限制,可能会好一些,建议你用最新的版本试试

已经获得了图库后台的权限,graphd,metad,storaged日志等级都是0
但是我没从日志中得到任何关于我导入无TAG点的相关的报错,警告信息

失败的语句应该是因为乱码导致失败的,解决方法在这:

:smiley:这个我已经加上了,但是还是有失败的数据.现在大概找到原因了,是年龄用的是int,但是hive数据里,很多行的数据中的年龄有英文字母,这可能是导致失败的原因

但是不知道为什么会导入无TAG的点,希望后续我升级图库版本后能解决