淺析圖數據庫 Nebula Graph 數據導入工具——Spark Writer

Spark Writer

從 Hadoop 提及

近年來隨着大數據的興起,分佈式計算引擎層出不窮。Hadoop 是 Apache 開源組織的一個分佈式計算開源框架,在不少大型網站上都已經獲得了應用。Hadoop 的設計核心思想來源於 Google MapReduce 論文,靈感來自於函數式語言中的 map 和 reduce 方法。在函數式語言中,map 表示針對列表中每一個元素應用一個方法,reduce 表示針對列表中的元素作迭代計算。經過 MapReduce 算法,能夠將數據根據某些特徵進行分類規約,處理並獲得最終的結果。git

再談 Apache Spark

Apache Spark 是一個圍繞速度、易用性構建的通用內存並行計算框架。在 2009 年由加州大學伯克利分校 AMP 實驗室開發,並於 2010 年成爲 Apache 基金會的開源項目。Spark 借鑑了 Hadoop 的設計思想,繼承了其分佈式並行計算的優勢,提供了豐富的算子。github

Spark 提供了一個全面、統一的框架用於管理各類有着不一樣類型數據源的大數據處理需求,支持批量數據處理與流式數據處理。Spark 支持內存計算,性能相比起 Hadoop 有着巨大提高。Spark 支持 Java,Scala 和 Python 三種語言進行編程,支持以操做本地集合的方式操做分佈式數據集,而且支持交互查詢。除了經典的 MapReduce 操做以外,Spark 還支持 SQL 查詢、流式處理、機器學習和圖計算。算法

Spark Stack

彈性分佈式數據集(RDD,Resilient Distributed Dataset)是 Spark 最基本的抽象,表明不可變的分區數據集。RDD 具備可容錯和位置感知調度的特色。操做 RDD 就如同操做本地數據集合,而沒必要關心任務調度與容錯等問題。RDD 容許用戶在執行多個查詢時,顯示地將工做集合緩存在內存中,後續查詢可以重用該數據集。RDD 經過一系列的轉換就就造成了 DAG,根據 RDD 之間的依賴關係的不一樣將 DAG 劃分紅不一樣的 Stage。數據庫

與 RDD 類似,DataFrame 也是一個不可變分佈式數據集合。區別於 RDD,DataFrame 中的數據被組織到有名字的列中,就如同關係型數據庫中的表。設計 DataFrame 的目的就是要讓對大型數據集的處理變得更簡單,容許開發者爲分佈式數據集指定一個模式,便於進行更高層次的抽象。apache

DataSet 是一個支持強類型的特定領域對象,這種對象能夠函數式或者關係操做並行地轉換。DataSet 就是一些有明確類型定義的 JVM 對象的集合,能夠經過 Scala 中定義的 Case Class 或者 Java 中的 Class 來指定。DataFrame 是 Row 類型的 Dataset,即 Dataset[Row]。DataSet 的 API 是強類型的;並且能夠利用這些模式進行優化。編程

DataFrame 與 DataSet 只在執行行動操做時觸發計算。本質上,數據集表示一個邏輯計劃,該計劃描述了產生數據所需的計算。當執行行動操做時,Spark 的查詢優化程序優化邏輯計劃,並生成一個高效的並行和分佈式物理計劃。json

Spark API

基於 Spark 的數據導入工具

Spark Writer 是 Nebula Graph 基於 Spark 的分佈式數據導入工具,基於 DataFrame 實現,可以將多種數據源中的數據轉化爲圖的點和邊批量導入到圖數據庫中。api

目前支持的數據源有:Hive 和HDFS。數組

Spark Writer 支持同時導入多個標籤與邊類型,不一樣標籤與邊類型能夠配置不一樣的數據源。緩存

Spark Writer 經過配置文件,從數據中生成一條插入語句,發送給查詢服務,執行插入操做。Spark Writer 中插入操做使用異步執行,經過 Spark 中累加器統計成功與失敗數量。

獲取 Spark Writer

編譯源碼

git clone https://github.com/vesoft-inc/nebula.git  
cd nebula/src/tools/spark-sstfile-generator  
mvn compile package

標籤數據文件格式

標籤數據文件由一行一行的數據組成,文件中每一行表示一個點和它的屬性。通常來講,第一列爲點的 ID ——此列的名稱將在後文的映射文件中指定,其餘列爲點的屬性。例如Play標籤數據文件格式:

{"id":100,"name":"Tim Duncan","age":42}  
{"id":101,"name":"Tony Parker","age":36}  
{"id":102,"name":"LaMarcus Aldridge","age":33}

邊類型數據文件格式

邊類型數據文件由一行一行的數據組成,文件中每一行表示一條邊和它的屬性。通常來講,第一列爲起點 ID,第二列爲終點 ID,起點 ID 列及終點 ID 列會在映射文件中指定。其餘列爲邊屬性。下面以 JSON 格式爲例進行說明。

以邊類型 follow 數據爲例:

{"source":100,"target":101,"likeness":95}  
{"source":101,"target":100,"likeness":95}  
{"source":101,"target":102,"likeness":90}  
{"source":100,"target":101,"likeness":95,"ranking":2}  
{"source":101,"target":100,"likeness":95,"ranking":1}  
{"source":101,"target":102,"likeness":90,"ranking":3}

配置文件格式

Spark Writer 使用 HOCON 配置文件格式。HOCON(Human-Optimized Config Object Notation)是一個易於使用的配置文件格式,具備面向對象風格。配置文件由 Spark 配置段,Nebula 配置段,以及標籤配置段和邊配置段四部分組成。

Spark 信息配置了 Spark 運行的相關參數,Nebula 相關信息配置了鏈接 Nebula 的用戶名和密碼等信息。 tags 映射和 edges 映射分別對應多個 tag/edge 的輸入源映射,描述每一個 tag/edge 的數據源等基本信息,不一樣 tag/edge 能夠來自不一樣數據源。

Nebula 配置段主要用於描述 nebula 查詢服務地址、用戶名和密碼、圖空間信息等信息。

nebula: {  
  # 查詢引擎 IP 列表  
  addresses: ["127.0.0.1:3699"]  
  
  # 鏈接 Nebula Graph 服務的用戶名和密碼  
  user: user  
  pswd: password  
  
  # Nebula Graph 圖空間名稱  
  space: test  
  
  # thrift 超時時長及重試次數,默認值分別爲 3000 和 3  
  connection {  
    timeout: 3000  
    retry: 3  
  }  
  
  # nGQL 查詢重試次數,默認值爲 3  
  execution {  
    retry: 3  
  }  
}  

Nebula 配置段

標籤配置段用於描述導入標籤信息,數組中每一個元素爲一個標籤信息。標籤導入主要分爲兩種:基於文件導入與基於 Hive 導入。

  • 基於文件導入配置需指定文件類型
  • 基於 Hive 導入配置需指定執行的查詢語言。
# 處理標籤  
tags: [  
  
  # 從 HDFS 文件加載數據, 此處數據類型爲 Parquet tag 名稱爲 ${TAG_NAME}  
  #  HDFS Parquet 文件的中的 field_0、field_1將寫入 ${TAG_NAME}  
  # 節點列爲 ${KEY_FIELD}
  {  
    name: ${TAG_NAME}  
    type: parquet  
    path: ${HDFS_PATH}  
    fields: {  
      field_0: nebula_field_0,  
      field_1: nebula_field_1  
    }  
    vertex: ${KEY_FIELD}  
    batch : 16  
  }  
  
  # 與上述相似  
  # 從 Hive 加載將執行命令 $ {EXEC} 做爲數據集  
  {  
    name: ${TAG_NAME}  
    type: hive  
    exec: ${EXEC}  
    fields: {  
      hive_field_0: nebula_field_0,  
      hive_field_1: nebula_field_1  
    }  
    vertex: ${KEY_FIELD}
  }  
] 

說明:

  • name 字段用於表示標籤名稱
  • fields 字段用於配置 HDFS 或 Hive 字段與 Nebula 字段的映射關係
  • batch 參數意爲一次批量導入數據的記錄數,須要根據實際狀況進行配置。

邊類型配置段用於描述導入標籤信息,數組中每一個元素爲一個邊類型信息。邊類型導入主要分爲兩種:基於文件導入與基於Hive導入。

  • 基於文件導入配置需指定文件類型
  • 基於Hive導入配置需指定執行的查詢語言
# 處理邊  
edges: [  
  # 從 HDFS 加載數據,數據類型爲 JSON  
  # 邊名稱爲 ${EDGE_NAME}  
  # HDFS JSON 文件中的 field_0、field_1 將被寫入${EDGE_NAME}  
  # 起始字段爲 source_field,終止字段爲 target_field ,邊權重字段爲 ranking_field。  
  {  
    name: ${EDGE_NAME}  
    type: json  
    path: ${HDFS_PATH}  
    fields: {  
      field_0: nebula_field_0,  
      field_1: nebula_field_1  
    }  
    source:  source_field  
    target:  target_field  
    ranking: ranking_field  
  }  
  
  # 從 Hive 加載將執行命令 ${EXEC} 做爲數據集  
  # 邊權重爲可選  
  {  
    name: ${EDGE_NAME}  
    type: hive  
    exec: ${EXEC}  
    fields: {  
      hive_field_0: nebula_field_0,  
      hive_field_1: nebula_field_1  
    }  
    source:  source_id_field  
    target:  target_id_field  
  }  
]  

說明:

  • name 字段用於表示邊類型名稱
  • fields 字段用於配置 HDFS 或 Hive 字段與 Nebula 字段的映射關係
  • source 字段用於表示邊的起點
  • target 字段用於表示邊的終點
  • ranking 字段用於表示邊的權重
  • batch 參數意爲一次批量導入數據的記錄數,須要根據實際狀況進行配置。

導入數據命令

bin/spark-submit \  
 --class com.vesoft.nebula.tools.generator.v2.SparkClientGenerator \  
 --master ${MASTER-URL} \  
 ${SPARK_WRITER_JAR_PACKAGE} -c conf/test.conf -h -d  

說明:

  • -c:config 用於指定配置文件路徑
  • -h:hive 用於指定是否支持 Hive
  • -d:dry 用於測試配置文件是否正確,並不處理數據。
做者有話說:Hi ,你們好,我是 darion,Nebula Graph 的軟件工程師,對分佈式系統方面有些當心得,但願上述文章能夠給你們帶來些許啓發。限於水平,若有不當之處還請斧正,在此感謝^^

喜歡這篇文章?來來來,給咱們的 GitHub 點個 star 表鼓勵啦~~ 🙇‍♂️🙇‍♀️ [手動跪謝]

交流圖數據庫技術?交個朋友,Nebula Graph 官方小助手微信:NebulaGraphbot 拉你進交流羣~~

相關文章
相關標籤/搜索