最近我试着搭建了方便大家一键试玩的 Nebula Graph 中的Spark 相关的项目,今天就把它们整理成文分享给大家。而且,我趟出来了 PySpark 下的 Nebula Spark Connector 的使用方式,后边也会一并贡献到文档里。
NebulaGraph 的三个 Spark 子项目
我曾经围绕 NebulaGraph 的所有数据导入方法画过一个草图,其中已经包含了 Spark Connector,Nebula Exchange 的简单介绍。在这篇文章中我将它们和另外的 Nebula Algorithm 进行稍微深入的探讨。
注:这篇文档 也很清楚为我们列举了不同导入工具的选择。
TL;DR
- Nebula Spark Connector 是一个 Spark Lib,它能让 Spark 应用程序能够以
dataframe
的形式从 NebulaGraph 中读取和写入图数据。 - Nebula Exchange 建立在 Nebula Spark Connector 之上,作为一个 Spark Lib 同时可以直接被 Spark 提交 JAR 包执行的应用程序,它的设计目标是和 NebulaGraph 交换不同的数据源(对于开源版本,它是单向的:写入,而对于企业版本,它是双向的)。Nebula Exchange 支持的很多不同类型的数据源如:MySQL、 Neo4j 、 PostgreSQL 、 ClickHouse 、Hive 等。除了直接写入 NebulaGraph,它还可以选择生成 SST 文件,并将其注入 NebulaGraph,以便使用 NebulaGraph 集群之外算力帮助排序底层。
- Nebula Algorithm,建立在 Nebula Spark Connector 和 GraphX 之上,也是一个Spark Lib 和 Spark 上的应用程序,它用来在 NebulaGraph 的图上运行常用的图算法(pagerank,LPA等)。
Nebula Spark Connector
- 代码: https://github.com/vesoft-inc...
- 文档: https://docs.nebula-graph.io/...
- JAR 包: https://repo1.maven.org/maven...
- 代码例子:example
NebulaGraph Spark Reader
为了从 NebulaGraph 中读取数据,比如读 vertex,Nebula Spark Connector 将扫描所有带有给定 TAG 的 Nebula StorageD,比如这样表示扫描 player
这个 TAG : withLabel("player")
,我们还可以指定 vertex 的属性: withReturnCols(List("name", "age"))
。
指定好所有的读 TAG 相关的配置之后,调用 spark.read.nebula.loadVerticesToDF
返回得到的就是扫描 NebulaGraph 之后转换为 Dataframe 的图数据,像这样:
def readVertex(spark: SparkSession): Unit = { LOG.info("start to read nebula vertices") val config = NebulaConnectionConfig .builder() .withMetaAddress("metad0:9559,metad1:9559,metad2:9559") .withConenctionRetry(2) .build() val nebulaReadVertexConfig: ReadNebulaConfig = ReadNebulaConfig .builder() .withSpace("basketballplayer") .withLabel("player") .withNoColumn(false) .withReturnCols(List("name", "age")) .withLimit(10) .withPartitionNum(10) .build() val vertex = spark.read.nebula(config, nebulaReadVertexConfig).loadVerticesToDF() vertex.printSchema() vertex.show(20) println("vertex count: " + vertex.count()) }
写入的例子我这里不列出,不过,前边给出的代码示例的链接里是有更详细的例子,这里值得一提的是, Spark Connector 读数据为了满足图分析、图计算的大量数据场景 ,和大部分其他客户端非常不同,它直接绕过了 GraphD,通过扫描 MetaD 和 StorageD 获得数据,但是写入的情况则是通过 GraphD 发起 nGQL DML 语句写入的。
接下来我们来做一个上手练习吧。
上手 Nebula Spark Connector
先决条件:假设下面的程序是在一台有互联网连接的 Linux 机器上运行的,最好是预装了 Docker 和 Docker-Compose。
拉起环境
首先,让我们用Nebula-Up 部署基于容器的 NebulaGraph Core v3、Nebula Studio、Nebula Console 和 Spark、Hadoop 环境,如果还没安装好它也会尝试为我们安装 Docker 和 Docker-Compose。
# Install Core with Spark Connector, Nebula Algorithm, Nebula Exchange curl -fsSL nebula-up.siwei.io/all-in-one.sh | bash -s -- v3 spark
你知道吗Nebula-UP 可以一键装更多东西,如果你的环境配置大一点(比如 8 GB RAM) curl -fsSL nebula-up.siwei.io/all-in-one.sh | bash
可以装更多东西,但是请注意Nebula-UP 不是为生产环境准备的。
上述边脚本执行后,让我们用Nebula-Console(N