帶你認識圖資料庫效能和場景測試利器LDBC SNB
摘要:本文主要介紹基於互動式查詢所用的資料生成器(下文簡稱Datagen),及LDBC SNB資料如何在華為圖引擎服務GES中應用。
本文分享自華為雲社群《【圖資料庫效能和場景測試利器LDBC SNB】系列一:資料生成器簡介 & 應用於GES服務》,作者:鬧鬧與球球
本文的主要內容包括:基於互動式查詢所用的資料生成器(下文簡稱Datagen)介紹,及LDBC SNB資料如何在華為圖引擎服務GES中應用。LDBC SNB所預設的節點和關係、資料生成器和系統的測試用例,形成了一個邏輯自恰的資料“武林”,以ldbc snb為測試標準的圖資料庫產品,就像是行走於其中的俠客們,都得遵循同一套“武林規矩”(測試用例),究竟誰能擊敗各方高手,問鼎盟主呢?
LDBC SNB概述
LDBC SNB,全稱The Linked Data Benchmark Council’s Social Network Benchmark,官網地址:http://ldbcouncil.org。LDBC是一個致力於發展圖資料管理的產業聯盟組織,它開發了一套標準的benchmarks,用於系統地衡量不同圖資料庫產品的功能和效能。SNB是基於社交網路場景開發的一組benchmarks,由互動式場景(Interactive workload)和商業智慧場景(Business Intelligence workload)組成。
LDBC SNB 專案包括3個元件:資料生成器(Datagen)、測試驅動程式(Test Driver,用於執行Benchmark的測試)和測試用例實現(Reference Implementation,目前提供了基於Cypher(Neo4j)和SQL(PostgreSQL)兩種查詢語言的測試用例實現)
LDBC SNB有兩種工作模式:
1、互動式查詢(Interactive workload),適用於事務性的線上查詢場景,比如基礎的增刪改查、shortestpath、多跳等;
2、商業智慧 (Business Intelligence workload),適用於根據企業業務場景制定的複雜查詢和大規模離線圖分析等場景。
在不同的工作模式下,【Datagen】、【Test Driver】 和【測試用例實現】都是不同的。
章節概覽
一、Datagen介紹
- 資料模型
- Data Types
- Data Schema
- Datagen的安裝和執行流程
- Datagen的引數設定
- 常規引數設定
- 規模因子
- 序列化模式
二、LDBC SNB在GES中的應用
一、Datagen介紹
資料模型
Data Types
Datagen支援的屬性datatype如下, 每種屬性都支援單值和列表兩種模式。
(截圖來源於官官方文件http://ldbcouncil.org/ldbc_snb_docs/ldbc-snb-specification.pdf)
Data Schema
(截圖來源於官方文件http://ldbcouncil.org/ldbc_snb_docs/ldbc-snb-specification.pdf)
如圖所示,Datagen生成的資料有預設的一套圖模型,包括:
8種節點:organization & place & tag & tagClass & person & forum & post & comment
15種關係,如下表:
這些預設的節點和關係,形成了一個邏輯自恰的資料“武林”,以ldbc snb為測試標準的圖資料庫產品,就像是行走於其中的俠客們,都得遵循同一套“武林規矩”(測試用例),究竟誰能擊敗各方高手,問鼎盟主呢?且拭目以待吧。
安裝和執行流程
在Interactive Workload模式下,Datagen的底座為hadoop;在BI Workload模式下,底座為Spark。
本次調研主要使用基於偽分散式hadoop的Datagen。
1)下載基於hadoop的ldbc datagen
https://github.com/ldbc/ldbc_snb_datagen_hadoop
2)使用偽分散式的hadoop
cd ldbc_snb_datagen_hadoop/
cp params-csv-composite.ini params.ini
wget http://archive.apache.org/dist/hadoop/core/hadoop-3.2.1/hadoop-3.2.1.tar.gz
tar xf hadoop-3.2.1.tar.gz
export HADOOP_CLIENT_OPTS="-Xmx2G"
# set this to the Hadoop 3.2.1 directory
export HADOOP_HOME=`pwd`/hadoop-3.2.1
./run.sh
3)編譯時出現缺失的jar包問題解決(報錯如下)
解決方案:
從windows環境下載https://simulation.tudelft.nl/maven/dsol/dsol-xml/1.6.9/
手動安裝缺失的jar包到本地的maven倉庫
mvn install:install-file -Dfile=dsol-xml-1.6.9.jar -DgroupId=dsol -DartifactId=dsol-xml -Dversion=1.6.9 -Dpackaging=jar
4)再次執行,完成生成
sh run.sh
生成的資料檔案儲存在${outputDir}/social_network。
引數設定
(以下引數介紹均省略了字首“ldbc.snb.datagen.”,即引數的完整格式為“ldbc.snb.datagen.xxx”)
1)常規引數
2)規模因子
LDBC SNB支援生成不同規模的圖資料集,generator.scaleFactor引數各取值對應的點邊數目如下表:
(截圖來源於官方文件http://ldbcouncil.org/ldbc_snb_docs/ldbc-snb-specification.pdf)
3)序列化模式
Datagen主要有4種Csv檔案的序列化模式,所生成的資料格式各有不同。
CsvBasic
基礎序列化模式,每種節點、節點和節點之間的關係都有獨立的csv檔案,如圖一所示:
圖一 每種節點、節點和節點之間的關係都有獨立的csv檔案,其中person_xx.csv均為person節點的屬性資料。
若某個屬性有多個取值,例如person的email屬性有多個值,則將person的email記錄單獨生成一個csv檔案,並將多個email分成多行記錄展示,如圖二所示:
圖二 person的email屬性單獨儲存,並在多個email分成多條記錄展示
CsvComposite(此模式生成的資料,與GES支援的Csv格式相似度最高)
在CsvBasic的基礎上,將有多個值的屬性和其他屬性合併為一個記錄,如圖三;並將多個值進行合併(以list的格式,分號分隔),如圖四;
圖三 person節點的屬性記錄合併為person_0_0.csv
圖四 language和email兩個list屬性合併在一行
CsvMergeForeign
在CsvBasic基礎上,如果節點間關係是1對多的,則將關係作為外來鍵合併入節點的屬性檔案中展示,如圖五
圖五 將comment-hasCreator->person、comment-isLocatedIn->place、comment-replyOf->post、comment-replyOf->comment關係與comment屬性檔案合併
CsvCompositeMergeForeign
是CsvComposite和 CsvMergeForeign的結合,既合併了list屬性,又將一對多關係進行了壓縮表示,如圖六
圖六 place列表示person-isLocatedIn->place關係的外來鍵表示,同時language和email以list形式展示
各序列化模式對應的引數值如下
CsvBasic
- ldbc.snb.datagen.serializer.dynamicActivitySerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.activity.CsvBasicDynamicActivitySerializer
- ldbc.snb.datagen.serializer.dynamicPersonSerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.person.CsvBasicDynamicPersonSerializer
- #ldbc.snb.datagen.serializer.staticSerializer:ldbc.snb.datagen.serializer.snb.csv.staticserializer.CsvBasicStaticSerializer
CsvComposite
- ldbc.snb.datagen.serializer.dynamicActivitySerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.activity.CsvCompositeDynamicActivitySerializer
- ldbc.snb.datagen.serializer.dynamicPersonSerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.person.CsvCompositeDynamicPersonSerializer
- ldbc.snb.datagen.serializer.staticSerializer:ldbc.snb.datagen.serializer.snb.csv.staticserializer.CsvCompositeStaticSerializer
CsvMergeForeign
- ldbc.snb.datagen.serializer.dynamicActivitySerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.activity.CsvMergeForeignDynamicActivitySerializer
- ldbc.snb.datagen.serializer.dynamicPersonSerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.person.CsvMergeForeignDynamicPersonSerializer
- ldbc.snb.datagen.serializer.staticSerializer:ldbc.snb.datagen.serializer.snb.csv.staticserializer.CsvMergeForeignStaticSerializer
CsvCompositeMergeForeign
- ldbc.snb.datagen.serializer.dynamicActivitySerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.activity.CsvCompositeMergeForeignDynamicActivitySerializer
- ldbc.snb.datagen.serializer.dynamicPersonSerializer:ldbc.snb.datagen.serializer.snb.csv.dynamicserializer.person.CsvCompositeMergeForeignDynamicPersonSerializer
- ldbc.snb.datagen.serializer.staticSerializer:ldbc.snb.datagen.serializer.snb.csv.staticserializer.CsvCompositeMergeForeignStaticSerializer
二、LDBC SNB在GES中的應用
Datagen生成的資料集與GES格式有以下3點區別
- 不同label的點id之間可能存在id重複的現象;
- knows關係是雙向的;
- 沒有label列。
使用DatagenToGES資料轉換指令碼(基於CsvComposite序列化模式)可以將LDBC數,需在python3.6環境下執行。
DatagenTOGES指令碼有如下功能:
- 將8種節點型別對映為1-8個數字字首,將原id轉換為以數字字首為開頭、長度為20bytes的新id,解決不同label的點之間id重複的問題;
- 增加knows邊檔案的反向邊資料;
- 增加label列。
轉換前檔案格式(CsvComposite序列化模式):
轉換後文件格式:
DatagenToGES轉換規模因子為100的大規模資料集用時約半個小時。
資料轉換指令碼核心程式碼片段:
在GES中匯入轉換後的LDBC SNB(示例資料為SF0.1),並執行PageRank演算法,效果如下圖:
- SPI:Java的高可擴充套件利器
- 二分查詢:一種效率較高的查詢方法
- 如何利用CANN DVPP進行圖片的等比例縮放?
- 什麼是編輯器中的常量傳播?
- Colocate Join :ClickHouse的一種高效能分散式join查詢模型
- Spring Cache設計之美,你品,你細品…
- Python影象處理丨帶你掌握影象幾何變換
- 帶你瞭解TensorFlow pb模型常用處理方法
- 編譯器優化:何為SLP向量化
- 煙霧、空氣質量、溫溼度…自己徒手做個環境檢測裝置
- 不止跑路,拯救誤操作rm -rf /*的小夥兒
- 畢昇編譯器優化:Lazy Code Motion
- 43%非常看好TypeScript…解讀“2022前端開發者現狀報告”
- 華為雲資料治理生產線DataArts,讓“資料‘慧’說話”
- 不需要伺服器,教你僅用30行程式碼搞定實時健康碼識別
- 編譯器工程師眼中的好程式碼:Loop Interchange
- 記憶體問題難定位,那是因為你沒用ASAN
- 大資料開發,Hadoop Spark太重?你試試esProc SPL
- 學python,怎麼能不學習scrapy呢!
- 如何面向物件程式設計?程式設計師:我也要先有“物件”啊