本文主要講述如何利用 Spark Connector 進行 Nebula Graph 數據的讀取。html
Spark Connector 是一個 Spark 的數據鏈接器,能夠經過該鏈接器進行外部數據系統的讀寫操做,Spark Connector 包含兩部分,分別是 Reader 和 Writer,而本文側重介紹 Spark Connector Reader,Writer 部分將在下篇和你們詳聊。java
Spark Connector Reader 是將 Nebula Graph 做爲 Spark 的擴展數據源,從 Nebula Graph 中將數據讀成 DataFrame,再進行後續的 map、reduce 等操做。git
Spark SQL 容許用戶自定義數據源,支持對外部數據源進行擴展。經過 Spark SQL 讀取的數據格式是以命名列方式組織的分佈式數據集 DataFrame,Spark SQL 自己也提供了衆多 API 方便用戶對 DataFrame 進行計算和轉換,能對多種數據源使用 DataFrame 接口。github
Spark 調用外部數據源包的是 org.apache.spark.sql
,首先了解下 Spark SQL 提供的的擴展數據源相關的接口。sql
createRelation()
會基於給定的 Params 參數生成新的 relation。要實現自定義 Spark 外部數據源,須要根據數據源自定義上述部分方法。shell
在 Nebula Graph 的 Spark Connector 中,咱們實現了將 Nebula Graph 做爲 Spark SQL 的外部數據源,經過 sparkSession.read
形式進行數據的讀取。該功能實現的類圖展現以下:數據庫
getSchema()
方法中鏈接 Nebula Graph 的 Meta 服務獲取配置的返回字段對應的 Schema 信息。compute()
方法中定義如何讀取 Nebula Graph 數據,主要涉及到進行 Nebula Graph 數據 Scan、將讀到的 Nebula Graph Row 數據轉換爲 Spark 的 InternalRow 數據,以 InternalRow 組成 RDD 的一行,其中每個 InternalRow 表示 Nebula Graph 中的一行數據,最終經過分區迭代的形式將 Nebula Graph 全部數據讀出組裝成最終的 DataFrame 結果數據。Spark Connector 的 Reader 功能提供了一個接口供用戶編程進行數據讀取。一次讀取一個點/邊類型的數據,讀取結果爲 DataFrame。apache
下面開始實踐,拉取 GitHub 上 Spark Connector 代碼:編程
git clone -b v1.0 git@github.com:vesoft-inc/nebula-java.git cd nebula-java/tools/nebula-spark mvn clean compile package install -Dgpg.skip -Dmaven.javadoc.skip=true
將編譯打成的包 copy 到本地 Maven 庫。api
應用示例以下:
nebula-spark
依賴<dependency> <groupId>com.vesoft</groupId> <artifactId>nebula-spark</artifactId> <version>1.1.0</version> </dependency>
// 讀取 Nebula Graph 點數據 val vertexDataset: Dataset[Row] = spark.read .nebula("127.0.0.1:45500", "spaceName", "100") .loadVerticesToDF("tag", "field1,field2") vertexDataset.show() // 讀取 Nebula Graph 邊數據 val edgeDataset: Dataset[Row] = spark.read .nebula("127.0.0.1:45500", "spaceName", "100") .loadEdgesToDF("edge", "*") edgeDataset.show()
配置說明:
address:能夠配置多個地址,以英文逗號分割,如「ip1:45500,ip2:45500」 space: Nebula Graph 的 graphSpace partitionNum: 設定spark讀取Nebula時的partition數,儘可能使用建立 Space 時指定的 Nebula Graph 中的 partitionNum,可確保一個Spark的partition讀取Nebula Graph一個part的數據。
tag:Nebula Graph 中點的 Tag fields:該 Tag 中的字段,,多字段名以英文逗號分隔。表示只讀取 fields 中的字段,* 表示讀取所有字段
edge:Nebula Graph 中邊的 Edge fields:該 Edge 中的字段,多字段名以英文逗號分隔。表示只讀取 fields 中的字段,* 表示讀取所有字段
Spark Connector Reader 的 GitHub 代碼:https://github.com/vesoft-inc/nebula-java/tree/master/tools/nebula-spark
在此特別感謝半雲科技所貢獻的 Spark Connector 的 Java 版本
[1] Extending Spark Datasource API: write a custom spark datasource
[2] spark external datasource source code
喜歡這篇文章?來來來,給咱們的 GitHub 點個 star 表鼓勵啦~~ 🙇♂️🙇♀️ [手動跪謝]
交流圖數據庫技術?交個朋友,Nebula Graph 官方小助手微信:NebulaGraphbot 拉你進交流羣~~