摘要:本文主要介紹基於交互式查詢所用的數據生成器(下文簡稱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算法,效果如下圖: