溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Spark數(shù)據(jù)導入中的實踐細節(jié)有哪些

發(fā)布時間:2021-12-17 09:56:44 來源:億速云 閱讀:129 作者:柒染 欄目:大數(shù)據(jù)

在Spark數(shù)據(jù)導入中的實踐細節(jié)有哪些,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

1.前言

圖譜業(yè)務隨著時間的推移愈發(fā)的復雜化,逐漸體現(xiàn)出了性能上的瓶頸:單機不足以支持更大的圖譜。然而,從性能上來看,Neo4j 的原生圖存儲有著不可替代的性能優(yōu)勢,這一點是之前調(diào)研的 JanusGraph、Dgraph 等都難以逾越的鴻溝。即使 JanusGraph 在 OLAP 上面非常出色,對 OLTP 也有一定的支持,但是 GraphFrame 等也足以支撐其 OLAP 需求,更何況在 Spark 3.0 會提供 Cypher 支持的情況下,圖譜的 OLAP 需求相比 OLTP 有更多途徑可以解決。這個時候,Nebula Graph 的“橫空出世”無疑是對分布式 OLTP 效率低下現(xiàn)狀的一種突破。

之前在各類調(diào)研、部署后,特別是從 JanusGraph 的 OLTP 效率最終測試發(fā)現(xiàn)無法滿足線上需求之后,我們不再對同一圖譜可以同時進行 OLAP 和 OLTP 進行強制性要求,而 Nebula Graph 的架構剛好符合圖譜方面的需要:

  1. 分布式——shared-nothing 分布式架構

  2. 高速 OLTP(性能需要和 Neo4j 相近)——Nebula Graph 的存儲層架構查詢直接映射物理地址,實際上可以算是原生圖存儲

  3. 服務的高可用(即在非人為情況下,圖譜可以穩(wěn)定提供服務)——局部失敗服務可用、有快照機制

  4. 保證可擴展性——支持線性擴容,由于開源、支持二次開發(fā)

綜上所述,Nebula Graph 架構上符合實際生產(chǎn)需求,因此對 Nebula Graph 進行了調(diào)研、部署、測試。關于部署、性能測試(美團 NLP 團隊性能測試、騰訊云安全團隊性能測試)的部分無論是官網(wǎng)還是其他同學在博客中都有比較詳盡的數(shù)據(jù),本文主要從 Spark 導入出發(fā),算是對 Nebula Graph 對 Spark 的支持進行粗淺的理解。

2.測試環(huán)境

  1. Nebula Graph 集群

    1. 3 臺 32 c(實際限制了16 c)

    2. 400 G 內(nèi)存(實際配置了 100 G)

    3. SSD

    4. 版本信息:Nebula Graph 版本 1.0.0(當時測試比較早)。

  2. 網(wǎng)絡環(huán)境:萬兆。

  3. 圖譜大小:十億級別節(jié)點(屬性較少),百億級別邊(有向,無屬性或帶權值)。

  4. Spark 集群

    1. 版本信息:Spark 2.1.0

實際上 Nebula Graph 的使用資源合計 2T 左右 memory (3 * 30 executor + 1 driver) * 25G。

3.Spark 批量導入

3.1 基礎流程

  1. 打包 sst.generator(Spark 生成 sst 所需要的包)。

  2. 配置 Nebula Graph 集群,Nebula Graph 集群正常啟動,創(chuàng)建圖譜。

  3. Spark 配置文件 config.conf(可以參考文檔《Spark 導入工具》)進行配置。

  4. 排查 Spark 集群是否存在沖突的包。

  5. Spark 啟動時使用配置文件和 sst.generator 快樂地導入。

  6. 數(shù)據(jù)校驗。

3.2 一些細節(jié)

  1. 批量導入前推薦先建立索引

這里推薦先建立索引的原因是:批量導入僅在非線上圖譜進行,雖然建立索引可以選擇是否在提供服務的同時進行,但是為了防止后續(xù) REBUILD 出現(xiàn)問題,這邊可以優(yōu)先建好索引。帶來的問題就是在批量導入結點時相對較慢。

  1. 推薦用 int 型節(jié)點 ID(可以使用 Snowflake算法 等),如果節(jié)點的 ID 不是 int 型,這里可以通過在節(jié)點/邊中加入 policy: "uuid" 來設置自動生成 uuid。

  2. 如果使用的是單獨的 Spark 集群可能不會出現(xiàn) Spark 集群有沖突包的問題,該問題主要是 sst.generator 中存在可能和 Spark 環(huán)境內(nèi)的其他包產(chǎn)生沖突,解決方法是 shade 掉這些沖突的包,或者改名。

  3. Spark 調(diào)優(yōu)方面:可以根據(jù)實際情況調(diào)整參數(shù),盡量降低 memory 以節(jié)約資源,相對的可以適當提高并行度加速。

3.3 導入結果

十億級別節(jié)點(屬性較少),百億級別邊(有向,無屬性或帶權值),提前建好索引的情況下大約消耗 20 小時左右導入全圖。

3.4 關于 PR

因為在較早的版本使用了 Spark 導入,自然也有一些不太完善的地方,這邊也提出了一些拙見,對 SparkClientGenerator.scala 略作了修改。

  1. 最早在使用 Spark Writer(現(xiàn):Exchange) 寫入 Nebula Graph 時,發(fā)現(xiàn)錯列的問題。

通過看源碼發(fā)現(xiàn) SparkClientGenerator.scala 存在 BUG,讀取的是配置文件的位置而非 parquet/json 文件的位置,修復后提了我第一個 PR#2187,有幸通過

  1. 后續(xù)發(fā)現(xiàn)使用 SparkClientGenerator 自動生成 uuid/hash 功能時,存在會出現(xiàn)重復的雙引號的問題,導致無法導入。

這塊可以說是由于解決問題的想法不同,提交了好多次。重復引號的問題歸根結底是對類型轉化的時候添加了一次雙引號,我這邊發(fā)現(xiàn)有個 extraIndexValue 的方法可以把用戶自填的非 string 類型的轉成 string 類型,我這邊想著可能會有用戶想把非 string 型的 index 轉成 uuid/hash(比如 array),所以修改的比較多。

但是和官方 @darionyaphet 溝通后,發(fā)現(xiàn)我這種做法其實是對數(shù)據(jù)源進行了修改,用戶傳 array 等不支持的類型時,應該報錯而不是轉換類型(這個確實,一開始只考慮到了邏輯上跑通以及自己這邊業(yè)務的使用,沒考慮通用性)。重新修改,提交 PR #2258,通過。經(jīng)過這次 PR 我也學到了很多。

  1. 之后發(fā)現(xiàn) nebula-python 也有和官方 thrift 沖突的問題,本來想 shade 后提 PR,但是覺得這個改動太大了,所以直接提給官方,近期也修復了。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI