本文由英特西格信息有限公司(IntSig)大數據團隊工程師劉家浩編寫。他一直在玩星云圖,是我們引以為豪的 GitHub 貢獻者之一。這篇文章分享他的經驗導入數據星云圖與火花。

為什么選擇星云圖?

與圖形相關的業務越來越復雜,一些流行的圖形數據庫中也發現了性能瓶頸。例如,單個計算機很難縮放到較大的圖形。在性能方面,Neo4j的本機圖形存儲具有不可替代的優勢。在我的調查中,JanusGraph、Dgraph 和其他圖形數據庫在這方面無法與 Neo4j 相媲美。JanusGraph 在 OLAP 中性能非常好,可以在一定程度上支持 OLTP。但是,這不再是 JanusGraph 的優勢,因為某些技術(如 GraphFrame)足以滿足 OLAP 要求。此外,由于 Spark 3.0 開始支持 Cypher,我發現與圖形的 OLTP 要求相比,其 OLAP 要求可以滿足更多技術。因此,星云圖無疑是對低效率分布式OLTP數據庫的突破。

我做了大量的研究,并部署了一些圖形數據庫。當我對 JanusGraph 的 OLTP 效率進行測試,發現它不能滿足我的在線業務需求時,我不再要求圖形數據庫的 OLAP 和 OLTP 具有相等或接近的性能。但我突然想到星云圖的架構具有滿足圖形要求的所有功能,例如:

  • 分布式:星云圖在存儲中采用無共享分布式體系結構。
  • 高速 OLTP,這意味著性能應與 Neo4j 相媲美:在星云圖中,其存儲層查詢可直接映射物理地址,物理地址可視為本機圖形存儲。
  • 高可用服務,這意味著,無需人工中斷,數據庫可以持續提供穩定的服務:服務在部分故障時可用,快照功能可用。
  • 保證可擴展性:星云圖形支持線性擴展,并且支持自定義開發,因為它是開源的。

星云圖的架構似乎滿足了我們在生產環境中的實際要求。因此,我進行了星云圖的研究、部署和測試。在部署和性能測試方面,您可以在星云圖官方網站和一些技術博客上找到一些詳細信息。請參閱Meituan 的基準測試和騰訊云的性能測試。本文主要介紹我在星云圖中的理解和經驗后,我使用 Spark 應用程序導入數據到星云圖0.0 (測試很早就完成了)

  • 網絡:10G網絡
  • 圖形大?。簲凳畠|個頂點(屬性很少),數百億條邊(定向且無屬性或加權)
  • 火花群集:使用 Spark 2.1.0。
  • 在此測試中,星云圖形總共使用了 2 個 TG 內存,該內存由方程計算:(3*30 執行器 = 1 個驅動程序) * 25 GB。

    使用 Spark 批量導入數據

    程序

    1. sst.generator ,這是 Spark 生成 SST 文件所需的。
    2. 配置星云圖形群集,啟動星云圖形群集,然后創建架構。
    3. 修改 Spark 配置文件 ( config.conf . .有關詳細信息,請參閱 Spark配置文件。
    4. 檢查并確保 Spark 群集中不存在沖突包。
    5. Spark 啟動后,使用配置文件 sst.generator 并導入數據。
    6. 驗證數據。

    一些提示要遵循

    以下是使用 Spark 應用程序的一些提示:

    1. 我建議在導入數據之前創建索引。

    批量導入數據只能對脫機圖形執行。在星云圖形中,您可以選擇為聯機或離線圖形服務創建索引。但是,當服務處于脫機狀態時,必須重新生成索引。為了防止過程中出現可能 REBUILD INDEX 的問題,我建議在數據插入之前創建一個索引。當然,這樣的操作可能會減慢頂點批量導入的速度。

    1. 我建議使用類型 int 值作為頂點 ID。

    您可以使用某些算法(如雪花算法)生成值。如果頂點 ID 不是類型 int ,您可以在配置文件 policy: "uuid" 中用于頂點或邊緣類型配置。

    1. 如果您的 Spark 部署在獨立模式下,您可以忽略沖突包問題,而這種情況模式下可能不會發生。如果您的 Spark 在群集上運行,則可能會出現此問題,因為 中某些包可能與 Spark sst.generator 群集中某些包沖突。若要解決沖突,可以對這些沖突包進行著色或重命名。

    2. Spark 調優 您可以調整參數以滿足業務需求,盡可能減少內存消耗,從而節省資源并加快并行性。

    數據導入性能

    當索引提前構建時,需要大約 20 個小時來批處理導入數十億頂點(屬性很少)和數百億條邊(定向且無屬性或加權)。

    將 GitHub PR 提交星云圖時吸取的經驗教訓

    我使用 Spark 應用程序與早期版本的星云圖, 所以問題是不可避免的Scala。

    1. 在使用 Spark Writer(現在交換)將數據導入星 云圖的早期階段,某些列無法正確對齊。通過閱讀源代碼,我發現在 SparkClientGenerator.scala 中存在一個錯誤,即已讀取 Parquet 配置文件 JSON (而不是 或 文件)。我修復了錯誤,并提交了PR#2187,我的第一個公關星云圖。我很高興公關被批準。

    2. 之后,當我使用 或 SparkClientGenerator 函數時 uuid() hash() ,我發現引入了重復的雙引號,因此無法完成批處理導入。

    在數據類型轉換過程中引入了額外的雙引號。我發現調用的 extraIndexValue 函數可用于將用戶定義的值從非字符串類型轉換為 String 類型。我想有些用戶可能想要將非字符串(例如數組值)索引轉換為 uuidhash ,因此我更改了一些源代碼并提交了新的 PR。

    不幸的是,新的公關是非常艱難的。我犯了幾次承諾,但還是沒有得到批準。在與星@darionyaphet圖的開發人員)溝通后,我知道我更改了源數據的格式。在他看來,一般來說,當用戶導入某些不受支持的格式的數據時,正確的回答是引發異常,而不是直接轉換格式。是的,這是有道理的。我過于專注于我的業務場景,我唯一的目標是讓代碼成功運行,但沒有考慮該工具的一般用途。

    對此,我提交了另一個公關,公關#2258,它被批準和合并。我從這個公關中學到很多東西。

    1. 后來,我發現在星云蛇節儉有沖突 fbthrift 。我想我可以遮蔽沖突,并提交另一個公關,但考慮到巨大的修改,我放棄了,并選擇提出一個問題星云圖,這是最近修復。

    來自星云圖的單詞:歡迎在 GitHub 上向星云圖形提交 PR。以下是供您參考的一些問題:https://github.com/vesoft-inc/nebula/issues

    總結

    在開始使用星云圖之前,我已經對JanusGraph進行了徹底的評估。經過比較,我印象非常深刻的是相對較少的秘密錯誤和星云圖的活躍社區。測試后,星云圖證明了自己的效率,并成為分布式圖形系統的首選 所有用戶都可以非??焖俚孬@得答復,并且對資源進行有效審查。我認為這是這個圖形數據庫快速而強勁增長最重要的因素。我希望我能不斷見證星云圖的成長,為星云圖生態的改善做出貢獻!

    Comments are closed.