spark-connector扫描图数据库点失败

nebula 版本:1.0.1

  • 部署方式(分布式 / 单机 / Docker / DBaaS):分布式

  • 出问题的 Space 的创建方式: CREATE SPACE nba (partition_num = 10, replica_factor = 1, charset = , collate = )

  • 问题的具体描述

按照spark-connector文档,编译nebula-spark之后,将得到的jar包上传服务器,之后用spark-shell执行ConnectReaderExample,但是提示Method not found

代码如下:

spark-shell --jars "/xxx/nebula-spark-1.0.1.jar"

import com.facebook.thrift.protocol.TCompactProtocol
import com.vesoft.nebula.tools.connector.NebulaDataFrameReader
import org.apache.spark.SparkConf
import org.apache.spark.graphx.Graph
import org.apache.spark.sql.{Dataset, Row, SparkSession}
import org.slf4j.LoggerFactory

def readNebulaVertex(spark: SparkSession): Unit = {
    //LOG.info("start loading nebula vertex to DataFrame ========")
    val vertexDataset: Dataset[Row] =
      spark.read
        .nebula("xxx.xxx.xxx", "nba", "10")
        .loadVerticesToDF("player", "*")
    val count = vertexDataset.count()
    vertexDataset.printSchema()
    vertexDataset.show()
    //LOG.error("**********vertex count:"+count, null);
  }
    val sparkConf = new SparkConf
    sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer").registerKryoClasses(Array[Class[_]](classOf[TCompactProtocol]))
    val spark = SparkSession.builder().master("local").config(sparkConf).getOrCreate()

    readNebulaVertex(spark)

看日志是metaClient的listSpaces打印的日志,nebula服务端没有找到对应的接口。

我通过spark-submit 执行ConnectReaderExample, 在1.0服务上是可以读出来,稍等我试下通过spark-shell读。
通过spark-submit读取的数据示例:
schema:()
image
dataFrame:

1 个赞

我按照你的步骤在spark-shell中操作了一遍,是可以读出来的。

你在nebula console中show spaces 看下meta服务是否正常。

1.show spaces是正常的,不知道是不是我编译的时候出了问题?但是好像编译时也没有报错呀
2. 有个问题一直想问:就是用这种方法扫图数据库的时候,好像是没有填写密码的步骤,只需要指定地址和图空间,tag信息?那鉴权这块怎么过的?

  1. 那你在spark shell中执行下 下面这个函数,看是否会报同样的错误。如果报错 你的meta服务应该是有问题,确认下版本号 & 重启服务尝试下。

       def testMetaClient(): Unit = {
            val metaClient = new MetaClientImpl("127.0.0.1", 45500);
            metaClient.connect()
            metaClient.listSpaces();
       }
    
  2. spark去读图数据库用的是Storage Client,Storage服务目前没有鉴权。

你好,我用1.0.1的环境按照你的流程操作了一遍,没有复现出这个问题。
你重新启动下服务,再走一遍流程看下吧。

你好,连接问题按照你的方法已经解决了 :sweat_smile:,谢谢

但是遇到了一个新问题:就是我读取指定图空间时,有时候读不出来;

  1. 某图空间partition num =10,我设置spark.read
    .nebula(“xxx.xx.xx.xxx:xxx”, “xx”, “10”),可以读出来
  2. 某图空间partition num=3,我设置spark.read
    .nebula(“xxx.xx.xx.xxx:xxx”, “xx”, “10”)可以读出来,但是
    spark.read
    .nebula(“xxx.xx.xx.xxx:xxx”, “xx”, “3”)读不出来
  3. 某图空间partition num =1000,设置1000读不出来

读不出来是报错还是只读出来部分数据还是一条数据都没有啊

都有 ,partitionNum=1000的是一条数据都读不出来,3的是读不全

好的,稍等我复现一下

你的数据量多大,日志有没有错误信息,可以把结果展示贴一下么。 spark sql show的默认条数为20条。

我试过 图空间设置partition为3,代码中设置3和10都能读出来,1000的设置也可读出来,我的测试数据比较小。

企业微信截图_16056876848545 企业微信截图_16056878132836
图一就是partitionNum=3的空间的结果,我把返回条数打印了一下,1000num的就和图一的上面那种类似,返回条数为0
图二是dump tool的结果
图三是space描述

我读取 一个partition_num为100的图,代码设置partition为1000和1,读出的数据量是对的。
image

db_dump结果:
节点1image
节点2image
节点3image

我的测试环境和你不同的是,图的副本数为1.

你在nebula console中执行下 show configs 看下enable_multi_versions 这个配置吧,是否支持多版本。多版本的话,db_dump是会统计多条的,spark 读取数据的是不同统计多条的。

我查看了enable_multi_versions,是设置为False,不是多版本的
我用spark扫描的问题主要在于每次扫描的数据都是不准的,有时候是0,有时候是14xx,有时候是正确结果。。
用的还是之前那个图空间如图,每次查都会不一样

你的创建schema的ddl可以发一下么,还有分布式部署中有几个 meta服务、几个graph服务、几个storage,是多节点分布式还是单节点多个端口的分布式,我尽量保持和你的环境一致。