圖數(shù)據(jù)導(dǎo)入技術(shù)性能優(yōu)化實踐
1、背景介紹
圖數(shù)據(jù)是NoSQL非關(guān)系型數(shù)據(jù)類型的一種,通過應(yīng)用圖形理論來存儲表示實體之間的關(guān)系信息,如社交網(wǎng)絡(luò)中人與人之間的關(guān)系、知識圖譜中實體間的連接關(guān)系等。圖數(shù)據(jù)庫的獨特設(shè)計,很好的彌補(bǔ)了關(guān)系數(shù)據(jù)庫不適用于存儲圖形數(shù)據(jù)、查詢邏輯復(fù)雜、查詢速度緩慢的缺點。因此,圖數(shù)據(jù)庫已廣泛應(yīng)用于社交網(wǎng)絡(luò)、精準(zhǔn)推薦、金融風(fēng)控、知識圖譜等領(lǐng)域。
數(shù)據(jù)導(dǎo)入功能作為大批量圖數(shù)據(jù)應(yīng)用的第一個且比較關(guān)鍵的環(huán)節(jié),在開展圖應(yīng)用過程中非常重要。經(jīng)過調(diào)研,市場上比較主流的圖數(shù)據(jù)庫有Neo4j,NebulaGraph,TigerGraph,JanusGraph,HugeGraph,DGraph等多個國內(nèi)外廠商。本文主要選取Neo4j,NebulaGraph,JanusGraph三種圖數(shù)據(jù)庫作為研究對象,深入對比分析各自在數(shù)據(jù)導(dǎo)入方面的特點,最后介紹下我們在數(shù)據(jù)導(dǎo)入技術(shù)方面的解決方案。
1.1 NebulaGraph圖數(shù)據(jù)庫
NebulaGraph是一款開源的分布式原生圖數(shù)據(jù)庫,采用shared-nothing分布式架構(gòu)設(shè)計,擅長處理千億節(jié)點萬億條邊的超大規(guī)模數(shù)據(jù)集,并且提供毫秒級查詢。它采用計算和存儲分離的架構(gòu)模式,基于RocksDB作為本地存儲引擎自研了高性能的KVStore,采用Raft協(xié)議保證分布式系統(tǒng)的多副本強(qiáng)一致性和高可用性。
NebulaGraph在數(shù)據(jù)導(dǎo)入方面提供了多種工具組件操作,如Importer、Console、Studio、Exchange等,其中Console是控制端使用命令行方式導(dǎo)入,適用于操作少量手工測試數(shù)據(jù);Studio組件可以通過瀏覽器導(dǎo)入本地機(jī)器上多個csv文件,只限制使用csv類型;Importer工具可以導(dǎo)入單機(jī)多個csv文件,一般數(shù)據(jù)量限制在億級以內(nèi)使用;Exchange組件基于Spark分布式集群,可以從csv、Hive、Neo4j、MySQL等多種數(shù)據(jù)源導(dǎo)入大批量數(shù)據(jù)集,支持十億級以上數(shù)據(jù);Spark-connector組件使用需要有一定的軟件研發(fā)能力,撰寫少量代碼。
每種工具的使用復(fù)雜度和導(dǎo)入速度可從下面的坐標(biāo)圖看出:
1.2 JanusGraph圖數(shù)據(jù)庫
JanusGraph是一款開源的分布式圖數(shù)據(jù)庫,基于Apache TinkerPop3框架開發(fā),采用Gremlin查詢語言,具備完善的工具鏈組件,助力用戶輕松構(gòu)建基于圖數(shù)據(jù)庫之上的應(yīng)用和產(chǎn)品。JanusGraph在存儲層設(shè)計中,支持分布式存儲、數(shù)據(jù)多副本、橫向擴(kuò)容,內(nèi)置多種后端存儲引擎,并且可通過插件方式集成第三方存儲來擴(kuò)展后端存儲引擎,如Cassandra、HBase、BerkeleyDB等數(shù)據(jù)中間件。
JanusGraph圖數(shù)據(jù)庫提供如下幾種數(shù)據(jù)導(dǎo)入方式:
? Api數(shù)據(jù)導(dǎo)入:該方案通過提交java api插入數(shù)據(jù)請求,可用于數(shù)據(jù)量較小的情況下使用;
? 基于Gremlin Server的批量數(shù)據(jù)導(dǎo)入:該方案通過gremlin語句提交插入請求,需搭建Gremlin Server服務(wù),要有一定的研發(fā)能力;
? 基于Bulk Loader組件導(dǎo)入:官方提供批量導(dǎo)入方式,需要Hadoop/Spark集群環(huán)境,支持json、csv、xml、kryo等類型,可用于大批量數(shù)據(jù)導(dǎo)入。
JanusGraph數(shù)據(jù)導(dǎo)入流程如下圖所示:
1.3 Neo4jGraph圖數(shù)據(jù)庫
Neo4j是一款由Java開發(fā)的半開源圖數(shù)據(jù)庫,采用Cypher查詢語言,支持快速數(shù)據(jù)庫操作和直觀的圖數(shù)據(jù)展示,且操作速度不會隨數(shù)據(jù)量增大而明顯降低。Neo4J采用原生圖存儲設(shè)計,在存儲節(jié)點時使用了"index-free" adjacency模型,每個節(jié)點都有指向其鄰居節(jié)點的指針,可在O(1)的時間內(nèi)找到鄰居節(jié)點,提供快速、高效的圖遍歷。
Neo4j支持以下幾種數(shù)據(jù)導(dǎo)入方式:
? 基于Cypher語法中的Load-csv方式:官方提供的ETL工具,僅支持csv文件,導(dǎo)入速度慢,需掌握 Cypher 語言,適用于小批量數(shù)據(jù);
? Neo4j-import導(dǎo)入工具:官方自帶的大數(shù)據(jù)量導(dǎo)入工具,支持并行可擴(kuò)展的大規(guī)模csv文件導(dǎo)入,適用于初始化數(shù)據(jù)在千萬級以上的數(shù)據(jù);
? BatchInserter導(dǎo)入工具:一種API數(shù)據(jù)導(dǎo)入方案,只能在Java中使用,導(dǎo)入速度很快,適用于千萬級以上大批量數(shù)據(jù)操作。
Neo4j圖數(shù)據(jù)庫架構(gòu)設(shè)計圖如下:
綜合比較以上多種圖數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)入能力情況,我們選取NebulaGraph國產(chǎn)圖數(shù)據(jù)庫的Exchange組件作為重點研究對象,它是一款A(yù)pache Spark應(yīng)用,基于Apache 2.0協(xié)議開放源代碼,支持多種不同格式、不同來源的數(shù)據(jù),如:csv、json、hdfs、hive、MySQL、kafka、Neo4j等,我們將從代碼架構(gòu)優(yōu)化、依賴集群調(diào)優(yōu)、存儲層結(jié)構(gòu)優(yōu)化等多個方面對組件的導(dǎo)入能力做優(yōu)化。
2、數(shù)據(jù)導(dǎo)入優(yōu)化技術(shù)點
經(jīng)過調(diào)查對比研究,當(dāng)前圖數(shù)據(jù)導(dǎo)入功能存在導(dǎo)入效率不高、數(shù)據(jù)源形式限制嚴(yán)格、工具操作復(fù)雜等問題,我們將以Exchange組件為基礎(chǔ),從導(dǎo)入流程框架優(yōu)化、Spark集群調(diào)優(yōu)策略、存儲層RocksDb組件優(yōu)化等不同維度研究提升數(shù)據(jù)導(dǎo)入效率,從而最大限度的縮短大批量數(shù)據(jù)導(dǎo)入時間,豐富導(dǎo)入數(shù)據(jù)源形式,節(jié)省使用人員的時間成本。
數(shù)據(jù)導(dǎo)入組件技術(shù)流程設(shè)計如下:
2.1 Exchange組件優(yōu)化
Exchange是基于Spark組件編寫的一款應(yīng)用,主要功能是將集群中多種不同格式的批式數(shù)據(jù)和流式數(shù)據(jù)批量導(dǎo)入到圖數(shù)據(jù)庫中。
我們通過設(shè)計并優(yōu)化“Reader-Processor-Writer”三層數(shù)據(jù)導(dǎo)入模型,并引入并發(fā)編程模型多線程處理不同點和不同邊的數(shù)據(jù)處理過程,其中Reader層讀取不同來源的批數(shù)據(jù)并生成分布式數(shù)據(jù)集 DataFrame,Processor層負(fù)責(zé)讀取DataFrame中的批數(shù)據(jù),通過提取圖數(shù)據(jù)的結(jié)構(gòu)特點,根據(jù)配置文件中設(shè)定的映射關(guān)系按列名獲取對應(yīng)值,在讀取到指定批處理的數(shù)據(jù)后,Writer層負(fù)責(zé)將獲取到的批數(shù)據(jù)一次性寫入到圖數(shù)據(jù)庫中。在整個處理流程中,部分參數(shù)設(shè)定對處理速率影響較大,如batch(指定單批次寫入圖數(shù)據(jù)庫的最大點邊數(shù)量)、partition(指定 Spark分片數(shù)量)、rate.limit(指定導(dǎo)入數(shù)據(jù)時令牌桶令牌數(shù)量限制)等,如何根據(jù)機(jī)器資源環(huán)境合理的設(shè)置相應(yīng)的參數(shù)非常重要。
在數(shù)據(jù)導(dǎo)入流程中,以充分利用spark分布式引擎資源為目的,根據(jù)服務(wù)器資源使用情況、數(shù)據(jù)插入速率和響應(yīng)時間等因素,通過設(shè)計集群動態(tài)參數(shù)自適應(yīng)策略,動態(tài)調(diào)整batch單次批量插入數(shù)據(jù)量,以及spark集群partition分區(qū)數(shù),合理的分區(qū)數(shù)能減少任務(wù)調(diào)度時間及數(shù)據(jù)傾斜問題,快速并行處理RDD數(shù)據(jù)集,最大程度利用集群性能,提升數(shù)據(jù)轉(zhuǎn)換效率。同時,設(shè)計RateLimiter限流機(jī)制,采用令牌桶算法控制圖數(shù)據(jù)庫單次gql數(shù)據(jù)插入量,保證在處理大批量數(shù)據(jù)時圖數(shù)據(jù)庫能正常平穩(wěn)運行。另外,利用斷點續(xù)傳能力,把上一階段未轉(zhuǎn)換完的數(shù)據(jù)(網(wǎng)絡(luò)中斷等原因),通過保存斷點方式繼續(xù)轉(zhuǎn)換,提升數(shù)據(jù)轉(zhuǎn)換穩(wěn)定性。
大批量圖數(shù)據(jù)導(dǎo)入流程架構(gòu)圖設(shè)計如下:
2.2 Spark集群優(yōu)化
Spark是一種基于內(nèi)存的快速、通用、可擴(kuò)展的大數(shù)據(jù)分析計算引擎,Exchange是基于Spark編寫的一款應(yīng)用,它基于Spark的分布式環(huán)境將集群中的數(shù)據(jù)批量遷移到圖數(shù)據(jù)庫中,如何充分利用好分布式集群資源,是提高Exchange數(shù)據(jù)導(dǎo)入效率的一個關(guān)鍵點。
我們在編寫好Exchange組件代碼程序后,按照Spark約定使用spark-submit命令提交運行,Spark支持local、standalone、mesos、yarn四種運行模式,生產(chǎn)環(huán)境推薦使用yarn集群模式運行,我們使用此模式進(jìn)行任務(wù)運行及調(diào)試。
通過一系列的調(diào)優(yōu)對比測試,結(jié)合官網(wǎng)等資料說明,總體來講要充分壓榨使用集群資源,在資源限制內(nèi)盡量多的調(diào)配內(nèi)存消耗和增加并發(fā)。在應(yīng)用運行調(diào)優(yōu)過程中,需根據(jù)當(dāng)前Spark集群配置來設(shè)置調(diào)優(yōu)各個參數(shù),以減少任務(wù)調(diào)度時間及數(shù)據(jù)傾斜問題,最大化提升數(shù)據(jù)運行效率。
? 個別重要參數(shù)簡要說明如下:num-executors 根據(jù)集群服務(wù)器臺數(shù)來參考設(shè)置,executor-cores根據(jù)每臺機(jī)器CPU核數(shù)來設(shè)置,driver-memory和execute-memeory根據(jù)總的內(nèi)存來設(shè)置,其中num-executors * execute-memory不能超過集群可用內(nèi)存等。
2.3 Storage存儲層優(yōu)化
圖存儲的主要數(shù)據(jù)是點和邊,Nebula圖數(shù)據(jù)庫將點和邊的信息存儲為key,同時將點和邊的屬性信息存儲在value中,以便更高效地使用屬性過濾。Nebula在Storage層使用RocksDB作為存儲組件,RocksDB是一個可插拔式的持久化存儲系統(tǒng),基于LSM架構(gòu),支持高效的讀寫吞吐,具備和分布式存儲系統(tǒng)類似的術(shù)語操作定義,如 WAL,Compact,Transaction等。
作為分布式存儲引擎的一個存儲媒介,在方案設(shè)計時為了保證數(shù)據(jù)一致性,RocksDB整個寫入鏈路會先寫WAL,再寫memtale,其中WAL保證了數(shù)據(jù)的高可用性,在宕機(jī)時可根據(jù)WAL恢復(fù)數(shù)據(jù)。
在存儲層的參數(shù)配置上,RocksDB中部分比較重要的參數(shù)介紹如下:rocksdb_block_cache,設(shè)置默認(rèn)塊緩存大小,用來緩存解壓后的數(shù)據(jù),建議設(shè)置為節(jié)點有效負(fù)載內(nèi)存的1/3左右;max_background_jobs,設(shè)置后臺工作子線程數(shù),加快壓縮效率,建議設(shè)置為節(jié)點機(jī)器的有效可用核數(shù);max_subcompactions,設(shè)置壓縮線程數(shù)。
上述參數(shù)可結(jié)合數(shù)據(jù)導(dǎo)入配置中batch等參數(shù)一起調(diào)試使用,進(jìn)而選擇與當(dāng)前環(huán)境資源比較匹配的一個理想?yún)?shù)配置。
存儲層數(shù)據(jù)寫入流程圖如下:
3、總結(jié)
上面是我們在大批量圖數(shù)據(jù)導(dǎo)入功能總結(jié)的一些優(yōu)化經(jīng)驗,經(jīng)過多種策略調(diào)優(yōu)設(shè)計,測試報告顯示在同等資源下億級數(shù)據(jù)量優(yōu)化前后導(dǎo)入性能提升了12.66%。軟件優(yōu)化是一項無止境的系統(tǒng)工程,除了上面我們提到的這些調(diào)優(yōu)策略之外,還有很多其它的處理手段我們沒有發(fā)現(xiàn),希望大家能繼續(xù)探索研究,多多交流。