
一文了解 Nebula Graph 上的 Spark 项目
本文整理自 Nebula Graph 开发者布道师 古思为(Wey)
最近我试着搭建了方便大家一键试玩的 Nebula Graph 中的 Spark 相关的项目,今天我把它们整理成了文章分享给大家。而且,我梳理出来了 PySpark 下的 Nebula Spark Connector 的使用方式,后边也会一并贡献到文档里。
>>>>
Nebula Graph 的三个 Spark 子项目
我曾经围绕 Nebula Graph 的所有数据导入方法画过一个草图 https://www.siwei.io/sketches/nebula-data-import-options/(参考下图),其中已经包含了 Spark Connector,Nebula Exchange 的简单介绍。在这篇文章中我将它们和另外的 Nebula Algorithm 进行稍微深入的探讨。
TL;DR
- Nebula Spark Connector 是一个 Spark Lib,它能让 Spark 应用程序能够以 DataFrame 的形式从 Nebula Graph 中读取和写入图数据。
- Nebula Exchange 建立在 Nebula Spark Connector 之上,作为一个 Spark Lib 同时可以直接被 Spark 提交 JAR 包执行的应用程序,它的设计目标是和 Nebula Graph 交换不同的数据源(对于开源版本,它是单向的:写入,而对于企业版本,它是双向的)。Nebula Exchange 支持的很多不同类型的数据源如:MySQL、Neo4j、PostgreSQL、ClickHouse、Hive 等。除了直接写入 Nebula Graph,它还可以选择生成 SST 文件,并将其注入 Nebula Graph,以便使用 Nebula Graph 集群之外算力帮助排序底层。
- Nebula Algorithm,建立在 Nebula Spark Connector 和 GraphX 之上,也是一个 Spark Lib 和 Spark 上的应用程序,它用来在 Nebula Graph 的图上运行常用的图算法(PageRank,LPA等)。
>>>>
Nebula Spark Connector
- 代码:https://github.com/vesoft-inc/nebula-spark-connector
- 文档:https://docs.nebula-graph.io/3.1.0/nebula-spark-connector/
- JAR 包:https://repo1.maven.org/maven2/com/vesoft/nebula-spark-connector/
- 代码例子:https://github.com/vesoft-inc/nebula-spark-connector/tree/master/example
Nebula Graph Spark Reader
为了从 Nebula Graph 中读取数据,比如读 VERTEX,Nebula Spark Connector 将扫描所有带有给定 TAG 的 Nebula StorageD,比如这样表示扫描 player 这个 TAG :withLabel("player"),我们还可以指定 VERTEX 的属性:withReturnCols(List("name", "age"))。
指定好所有的读 TAG 相关的配置之后,调用 spark.read.nebula.loadVerticesToDF 返回得到的就是扫描 Nebula Graph 之后转换为 DataFrame 的图数据,像这样:
写入的例子我这里不列出,不过,前边给出的代码示例的链接里是有更详细的例子,这里值得一提的是,Spark Connector 读数据为了满足图分析、图计算的大量数据场景,和大部分其他客户端非常不同,它直接绕过了 GraphD,通过扫描 MetaD 和 StorageD 获得数据,但是写入的情况则是通过 GraphD 发起 nGQL DML 语句写入的。
接下来我们来做一个上手练习吧。
上手 Nebula Spark Connector
先决条件:假设下面的程序是在一台有互联网连接的 Linux 机器上运行的,最好是预装了 Docker 和 Docker-Compose。
拉起环境
首先,让我们用 Nebula-Up https://github.com/wey-gu/nebula-up/ 部署基于容器的 Nebula Graph Core v3、Nebula Studio、Nebula Console 和 Spark、Hadoop 环境,如果还没安装好它也会尝试为我们安装 Docker 和 Docker-Compose。
你知道吗 Nebula-UP 可以一键装更多东西,如果你的环境配置大一点(比如 8 GB RAM)curl -fsSL nebula-up.siwei.io/all-in-one.sh | bash 可以装更多东西,但是请注意 Nebula-UP 不是为生产环境准备的。
上述边脚本执行后,让我们用 Nebula-Console https://docs.nebula-graph.com.cn/3.1.0/nebula-console/(Nebula Graph 的命令行客户端)来连接它。
加载一份数据进去,并执行一个图查询:
进入 Spark 环境
执行下面这一行,我们就可以进入到 Spark 环境:
如果我们想执行编译,可以在里边安装 mvn:
跑 Spark Connector 的例子
选项 1(推荐):通过 PySpark
- 进入 PySpark Shell
调用 Nebula Spark Reader
返回结果例子
选项 2:编译、提交示例 JAR 包
- 先克隆 Spark Connector 和它示例代码的代码仓库,然后编译:
注意,我们使用了 master 分支,因为当下 master 分支是兼容 3.x 的,一定要保证 spark connector 和数据库内核版本是匹配的,版本对应关系参考代码仓库的 README.md 。
替换示例项目的代码
- 把如下的代码粘贴进去,这里边我们对前边加载的图:basketballplayer 上做了顶点和边的读操作:分别调用 readVertex 和 readEdges。
然后打包成 JAR 包
最后,把它提交到 Spark 里执行:
成功之后,我们会得到返回结果:
事实上,在这个代码仓库下还有更多的例子,特别是 GraphX 的例子,你可以尝试自己去探索这部分。
请注意,在 GraphX 假定顶点 ID 是数字类型的,因此对于字符串类型的顶点 ID 情况,需要进行实时转换,请参考 Nebula Algorithom 中的例子 https://github.com/vesoft-inc/nebula-algorithm/blob/a82d7092d928a2f3abc45a727c24afb888ff8e4f/example/src/main/scala/com/vesoft/nebula/algorithm/PageRankExample.scala#L31,了解如何绕过这一问题。
>>>>
Nebula Exchange
- 代码:https://github.com/vesoft-inc/nebula-exchange/
- 文档:https://docs.nebula-graph.com.cn/3.1.0/nebula-exchange/about-exchange/ex-ug-what-is-exchange/
- JAR 包:https://github.com/vesoft-inc/nebula-exchange/releases
- 配置例子: exchange-common/src/test/resources/application.conf
Nebula Exchange 是一个 Spark Lib,也是一个可以直接提交执行的 Spark 应用,它被用来从多个数据源读取数据写入 Nebula Graph 或者输出 Nebula Graph SST 文件 https://docs.nebula-graph.com.cn/3.1.0/nebula-exchange/use-exchange/ex-ug-import-from-sst/#step_5_import_the_sst_file。
通过 spark-submit 的方式使用 Nebula Exchange 的方法很直接:
- 首先创建配置文件,让 Exchange 知道应该如何获取和写入数据
- 然后用指定的配置文件调用 Exchange 包
现在,让我们用上一章中创建的相同环境做一个实际测试。
一键试玩 Exchange
先跑起来看看
请参考前边拉起环境 https://www.siwei.io/spark-on-nebula-graph/#%e6%8b%89%e8%b5%b7%e7%8e%af%e5%a2%83 这一章节,先一键装好环境。
一键执行:
恭喜你,已经第一次执行成功一个 Exchange 的数据导入任务啦!
再看看一些细节
这个例子里,我们实际上是用 Exchange 从 CSV 文件这一其中支持的数据源中读取数据写入 Nebula Graph 集群的。这个 CSV 文件中第一列是顶点 ID,第二和第三列是 “姓名 “和 “年龄 “的属性:
咱们可以进到 Spark 环境里看看
- 可以看到我们提交 Exchange 任务时候指定的配置文件 exchange.conf 它是一个 HOCON 格式的文件:
- 在 .nebula 中描述了 Nebula Graph 集群的相关信息
- 在 .tags 中描述了如何将必填字段对应到我们的数据源(这里是 CSV 文件)等有关 Vertecies 的信息。
我们应该能看到那个 CSV 数据源和这个配置文件都在同一个目录下了:
然后,实际上我们可以手动再次提交一下这个 Exchange 任务
部分返回结果
更多的数据源,请参考文档和配置的例子。
关于 Exchange 输出 SST 文件的实践,你可以参考文档和我的旧文 Nebula Exchange SST 2.x 实践指南。
>>>>
Nebula Algorithm
- 代码仓库: https://github.com/vesoft-inc/nebula-algorithm
- 文档:https://docs.nebula-graph.com.cn/3.1.0/nebula-algorithm/
- JAR 包:https://repo1.maven.org/maven2/com/vesoft/nebula-algorithm/
- 示例代码:example/src/main/scala/com/vesoft/nebula/algorithm
通过 spark-submit 提交任务
我在这个代码仓库里给出了例子,今天我们借助 Nebula-UP 可以更方便体验它。
参考前边拉起环境这一章节,先一键装好环境。
在如上通过 Nebula-UP 的 Spark 模式部署了需要的依赖之后
- 加载 LiveJournal 数据集
在 LiveJournal 数据集上执行一个 PageRank 算法,结果输出到 CSV 文件中
检查输出结果:
配置文件解读
完整文件可查看此处 https://github.com/wey-gu/nebula-livejournal/blob/main/nebula-algorithm/algo-pagerank.conf。这里,我们介绍一下主要的字段:
- .data sink 是 csv,表示写到本地文件里。
.nebula.read 规定了读 Nebula Graph 集群的对应关系,这里是读取所有 edge type: follow 的边数据为一整张图
.algorithm 里配置了我们要调用的算法,和算法的配置
作为库在 Spark 中调用 Nebula Algoritm
请注意另一方面,我们可以将 Nebula Algoritm 作为一个库调用,它的好处在于:
- 对算法的输出格式有更多的控制 / 定制功能
- 可以对非数字 ID 的情况进行转换,见 https://github.com/vesoft-inc/nebula-algorithm/blob/a82d7092d928a2f3abc45a727c24afb888ff8e4f/example/src/main/scala/com/vesoft/nebula/algorithm/PageRankExample.scala#L48
这里我先不给出例子了,如果大家感兴趣可以给 Nebula-UP https://github.com/wey-gu/nebula-up/ 提需求,我也会增加相应的例子。
文章转载自公众号:Nebula Graph Community
