帶你認識圖資料庫效能和場景測試利器LDBC SNB

語言: CN / TW / HK
摘要:本文主要介紹基於互動式查詢所用的資料生成器(下文簡稱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.orgLDBC是一個致力於發展圖資料管理的產業聯盟組織,它開發了一套標準的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介紹

  1. 資料模型
  2. Data Types
  3. Data Schema
  4. Datagen的安裝和執行流程
  5. Datagen的引數設定
  6. 常規引數設定
  7. 規模因子
  8. 序列化模式

二、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點區別

  1. 不同label的點id之間可能存在id重複的現象;
  2. knows關係是雙向的;
  3. 沒有label列。

使用DatagenToGES資料轉換指令碼(基於CsvComposite序列化模式)可以將LDBC數,需在python3.6環境下執行。

DatagenTOGES指令碼有如下功能:

  1. 將8種節點型別對映為1-8個數字字首,將原id轉換為以數字字首為開頭、長度為20bytes的新id,解決不同label的點之間id重複的問題;
  2. 增加knows邊檔案的反向邊資料;
  3. 增加label列。

轉換前檔案格式(CsvComposite序列化模式):

轉換後文件格式:

DatagenToGES轉換規模因子為100的大規模資料集用時約半個小時。

資料轉換指令碼核心程式碼片段:

在GES中匯入轉換後的LDBC SNB(示例資料為SF0.1),並執行PageRank演算法,效果如下圖:

 

點選關注,第一時間瞭解華為雲新鮮技術~