关于如何使用 nebula-spark-connector

  • nebula 版本:

  • 部署方式:单机

  • 安装方式:tar包方式

  • 是否为线上版本:N

  • 硬件信息:

    • 磁盘:2T SSD
    • CPU、内存信息:32核、256G
  • 问题的具体描述:

请问如何通过启动spark-shell读取nebula里的数据呢?看到帖子中有同学提供了如下的启动方式,但是似乎连不上终端

另外,Nebula官方文档很多操作写的也都非常简略,关键的操纵步骤都是一笔带过,对于初学者依然困惑满满。

对于不熟悉java操作的小白,如何通过在spark中完成上述的所有配置和算法调用?非常感谢各位大神赐教,谢谢:pray:

您截图的部分是 spark 上运行算法的 algorithm 哈(它依赖 spark connector)
如果只是想读写数据,请参考这里:nebula-spark-connector/README_CN.md at master · vesoft-inc/nebula-spark-connector · GitHub

读取 Nebula Graph 的点数据:

  val config = NebulaConnectionConfig
    .builder()
    .withMetaAddress("127.0.0.1:9559")
    .withConenctionRetry(2)
    .build()
  val nebulaReadVertexConfig = ReadNebulaConfig
    .builder()
    .withSpace("exchange")
    .withLabel("person")
    .withNoColumn(false)
    .withReturnCols(List("birthday"))
    .withLimit(10)
    .withPartitionNum(10)
    .build()
  val vertex = spark.read.nebula(config, nebulaReadVertexConfig).loadVerticesToDF()

读取 Nebula Graph 的点边数据构造 Graphx 的图:

  val config = NebulaConnectionConfig
    .builder()
    .withMetaAddress("127.0.0.1:9559")
    .withConenctionRetry(2)
    .build()
  val nebulaReadVertexConfig = ReadNebulaConfig
    .builder()
    .withSpace("exchange")
    .withLabel("person")
    .withNoColumn(false)
    .withReturnCols(List("birthday"))
    .withLimit(10)
    .withPartitionNum(10)
    .build()

  val nebulaReadEdgeConfig = ReadNebulaConfig
    .builder()
    .withSpace("exchange")
    .withLabel("knows1")
    .withNoColumn(false)
    .withReturnCols(List("timep"))
    .withLimit(10)
    .withPartitionNum(10)
    .build()

  val vertex = spark.read.nebula(config, nebulaReadVertexConfig).loadVerticesToGraphx()
  val edgeRDD = spark.read.nebula(config, nebulaReadEdgeConfig).loadEdgesToGraphx()
  val graph = Graph(vertexRDD, edgeRDD)

非常感谢您的回复,其实我就是想了解如何在spark上运行algorithm,目前已经安装了spark connector,但是不知道如何如何操作,所有操作必须在maven中进行吗?我可以启动spark终端,在终端输入命令行进行操作吗?

可以从 jar 包提交的哈(输出的可定制性不如代码里引用,如果结果刚好是你想要的,这样更方便,从shell就可以调用),就是如文档提到的 nebula-algorithm/README-CN.md at master · vesoft-inc/nebula-algorithm · GitHub

如果你想找一个更直观的,我之前做的一个互动教程里涉及了:

在最后一步,我手动启动了一个 spark 在容器里,然后shell 提交了 nebula-algorithm 的 jar 包,跑了 pagerank

下面是我这边关于spark connector的安装情况,jar包存在/data/nebula-spark-connector/路径下,安装结果存在/usr/local/src/nebula-spark-connector/路径下,想知道我如何去操作spark connector?

你需要的、直接操作的不是 spark connector 而是 nebula-algorithm ,nebula-algorithm 里边自带了 spark connector 哈。看我的例子,我只是 spark 里提交了 nebula-algorithm 的 jar 包

wget https://repo1.maven.org/maven2/com/vesoft/nebula-algorithm/2.0.0/nebula-algorithm-2.0.0.jar


/spark/bin/spark-submit --master "local" --conf spark.rpc.askTimeout=6000s \
    --class com.vesoft.nebula.algorithm.Main \
    --driver-memory 1g nebula-algorithm-2.0.0.jar \
    -p pagerank.conf

提交 nebula algorithm jar 包不需要安装任何依赖的。

感谢您上面的示例分享,稍后我会仔细去学习一下。
您后面采用的是通过修改pagerank.conf配置文件,然后提交spark-submit任务的方式对吧?这种方式参考您们的官方文档,我大概了解,主要是另外还有一种方式是通过编辑脚步的方式,想了解这种方式我该如何操作?

请参考测试代码 nebula-algorithm/nebula-algorithm/src/test/scala/com/vesoft/nebula/algorithm/lib at master · vesoft-inc/nebula-algorithm · GitHub

比如 pr,我 java 不熟哈,我理解你是要把依赖在 xml 里描述加上,再用 mvn 去拉取,代码里的例子如下

对这是这种,作为数据挖掘人员我平时更多基于pycharm进行python操作,对java和maven操作我也不熟,所以特别希望你们有一个小白操作示例,就其中的某一种算法调用操作的整个流程走一遍,这样我们也可以照葫芦画瓢,熟悉具体怎么去操作?

哈,你指出的对,maven 的话,可以参考一下 Maven 引入外部依赖 | 菜鸟教程

有了依赖之后,我提了 PR 加了详细一点的描述,不过这个例子现在是从 csv 读取数据,从 nebula 读取要写相应的配置,还是可以通过 conf 文件去读取,读取 conf 文件的方法可以参考 https://github.com/vesoft-inc/nebula-algorithm/blob/master/nebula-algorithm/src/test/scala/com/vesoft/nebula/algorithm/config/ConfigSuite.scala

我之后会研究加一下顺滑的逐步操作的示例,感谢提醒:+1:t2:

可以的哈,非常感谢您耐心的解答,我先自己尝试操作,同时也非常期待您们的操作示例展示

1 个赞

您好,打扰您一下,想问一下单机版和分布式在性能方面差异有多大,目前我们自己部署了单机版:
配置情况:32核,256G内存,2T SSD磁盘
导入数据量:2亿+节点,3.2亿+边

我们在实际查询过程中,发现单机性能比较差,例如:
LOOKUP ON NIK WHERE NIK.nik_age > 50 YIELD properties(vertex).idcard, properties(vertex).nik_age | limit 10;
就这样一条语句,我们将响应时间设置为10分钟,都无法返回查询结果

1 个赞