圖數據庫 TigerGraph 使用全攻略

與關係型數據庫或其他類型的NoSQL數據庫相比,圖數據庫提供了更有效的關係和網絡建模方法。在1999年左右,圖數據庫領域還是Neo4j一家獨大,但是發展至今,該領域也出現了很多新玩家和新產品。

TigerGraph是一款“實時原生並行圖數據庫”,既可以部署在雲端也可以部署在本地,支持垂直擴展和水平擴展,可以對集羣中的圖數據自動分區,遵循ACID標準,並且提供了內置的數據壓縮功能。它使用了一種消息傳遞架構,這種架構具備了可隨數據增長而伸縮的並行性。

TigerGraph被設計用來執行深層鏈接分析以及實時在線事務處理(OLTP)和大容量數據加載。深度鏈接分析是指從一個頂點開始遍歷圖,找到三個或更多的跳轉關係,並分析出結果。目前大多數圖數據庫都是爲OLTP設計的,用於分析少量的關係跳數,其他的分析功能基本是後續添加的。

目前,有一些開源的圖查詢語言已經得到了廣泛的採用,如Cypher、Gremlin和SPARQL,不過,TigerGraph使用了一種新的查詢語言GSQL。GSQL將SQL風格的查詢語法與Cypher風格的圖導航語法結合在一起,並加入了過程編程和用戶自定義函數。

我對TigerGraph的GSQL查詢語言一直有一種說不清的感覺,不可否認的是,它是一種很好的設計,支持並行化,且可以將Cypher轉換爲GSQL,便於從Neo4j數據庫轉到TigerGraph的開發者使用。但是,面對一門全新的編程語言,我總會問自己,它是否值得我花時間和精力來學習呢?

TigerGraph的架構

從下圖中可以看出,TigerGraph包含了一個ETL加載器、圖數據存儲和處理引擎、查詢語言和可視化客戶端以及REST API,並集成了很多企業數據基礎設施服務。再往下的系統流程圖清楚地表明,TigerGraph使用Apache Kafka與圖形處理和存儲引擎進行通信,使用Nginx Web服務器處理GraphStudio和來自用戶的GSQL請求,並將它們傳給後端服務器。
image

TigerGraph Analytics Platform包含了圖數據存儲引擎、圖數據處理引擎和三種類型的API。它可以在本地、雲端或混合環境中運行。

傳給TigerGraph的消息可以在頂點或邊級別進行並行處理。RESTPP是一種增強的REST API服務器,主要用於任務管理。

TigerGraph每小時可以加載多達150 GB的數據,每臺機器每秒可以遍歷數億個頂點或邊,將20億個日常事件以流的方式實時地傳輸到包含1千億個頂點和6千億條邊的圖中(這些圖數據處於包含20臺商用機器的集羣上),並將實時分析與大規模離線數據處理統一起來。

image

TigerGraph使用了幾種流行的開源組件:用於處理Web流量的Nginx、消息隊列Apache Kafka、用於管理Kafka集羣的Apache Zookeeper。平臺的其餘部分則使用了專有代碼。

在Docker中安裝TigerGraph

你可以在各種流行的Linux(加上Docker和VirtualBox)上安裝TigerGraph。我選擇在iMac上使用Docker來安裝。在開始安裝之前,我更新了Docker,並將Docker可用的RAM和處理器分別增加到4 GB和4個內核。最後,我將TigerGraph鏡像下載到本地。

Martins-iMac:Downloads mheller$ docker load < ./tigergraph-developer-2.2.3-docker-image.tar.gz
8823818c4748: Loading layer    119MB/119MB
19d043c86cbc: Loading layer  15.87kB/15.87kB
883eafdbe580: Loading layer  14.85kB/14.85kB
4775b2f378bb: Loading layer  5.632kB/5.632kB
75b79e19929c: Loading layer  3.072kB/3.072kB
2106b49716cb: Loading layer  7.168kB/7.168kB
da572f4e0c2f: Loading layer  4.034GB/4.034GB
6cd767fef659: Loading layer  338.4kB/338.4kB
Loaded image: tigergraph:2.2.3
Martins-iMac:Downloads mheller$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tigergraph          2.2.3               e1911655f9a7        3 weeks ago         4.11GB
hello-world         latest              4ab4c602aa5e        2 months ago        1.84kB

安裝過程中沒有出現任何警報,啓動過程也很順利。

Martins-iMac:Downloads mheller$ docker run -i -t --name tigergraph -p 4142:14240 tigergraph:2.2.3
Welcome to TigerGraph Developer Edition, for non-commercial use only.
[RUN    ] rm -rf /home/tigergraph/tigergraph/logs/ALL*.pid
[FAB    ][2018-11-30 21:56:06] check_port_of_admin_servers
[RUN    ] /home/tigergraph/tigergraph/.gium/GSQL_LIB/service/../scripts/admin_service.sh start
/home/tigergraph/tigergraph/bin/admin_server/config.sh
=== zk ===
[SUMMARY][ZK] process is down
[SUMMARY][ZK] /home/tigergraph/tigergraph/zk is ready
=== dict ===
[SUMMARY][DICT] process is down
[SUMMARY][DICT] dict server has NOT been initialized
=== kafka ===
[SUMMARY][KAFKA] process is down
[SUMMARY][KAFKA] queue has NOT been initialized
=== gse ===
[SUMMARY][GSE] process is down
[SUMMARY][GSE] id service has NOT been initialized
=== gpe ===
[SUMMARY][GPE] process is down
[SUMMARY][GPE] graph has NOT been initialized
=== nginx ===
[SUMMARY][NGINX] process is down
[SUMMARY][NGINX] nginx has NOT been initialized
=== restpp ===
[SUMMARY][RESTPP] process is down
[SUMMARY][RESTPP] restpp has NOT been initialized
[FAB    ][2018-11-30 21:56:47] launch_zookeepers
[FAB    ][2018-11-30 21:57:00] launch_gsql_subsystems:DICT
[FAB    ][2018-11-30 21:57:04] launch_kafkas
[FAB    ][2018-11-30 21:57:22] launch_ts3s
[FAB    ][2018-11-30 21:57:25] launch_gsql_subsystems:GSE
[FAB    ][2018-11-30 21:57:28] launch_gsql_subsystems:GPE
[FAB    ][2018-11-30 21:57:31] launch_gsql_subsystems:NGINX
[FAB    ][2018-11-30 21:57:34] launch_gsql_subsystems:RESTPP
[FAB    ][2018-11-30 21:57:38] check_port_of_vis_services
[RUN    ] LD_LIBRARY_PATH="/home/tigergraph/tigergraph/bin" 
home/tigergraph/tigergraph/visualization/utils/start.sh
[FAB    ][2018-11-30 21:57:39] check_port_of_admin_servers
[RUN    ] 
home/tigergraph/tigergraph/.gium/GSQL_LIB/service/../scripts/admin_service.sh start 
home/tigergraph/tigergraph/bin/admin_server/config.sh
[RUN    ] /home/tigergraph/tigergraph/dev/gdk/gsql/gsql_server_util START || :
=== zk ===
[SUMMARY][ZK] process is up
[SUMMARY][ZK] /home/tigergraph/tigergraph/zk is ready
=== kafka ===
[SUMMARY][KAFKA] process is up
[SUMMARY][KAFKA] queue is ready
=== gse ===
[SUMMARY][GSE] process is up
[SUMMARY][GSE] id service has NOT been initialized (not_ready)
=== dict ===
[SUMMARY][DICT] process is up
[SUMMARY][DICT] dict server is ready
=== ts3 ===
[SUMMARY][TS3] process is up
[SUMMARY][TS3] ts3 is ready
=== graph ===
[SUMMARY][GRAPH] graph has NOT been initialized
=== nginx ===
[SUMMARY][NGINX] process is up
[SUMMARY][NGINX] nginx is ready
=== restpp ===
[SUMMARY][RESTPP] process is up
[SUMMARY][RESTPP] restpp is ready
=== gpe ===
[SUMMARY][GPE] process is up
[SUMMARY][GPE] graph has NOT been initialized (not_ready)
=== gsql ===
[SUMMARY][GSQL] process is up
[SUMMARY][GSQL] gsql is ready
=== Visualization ===
[SUMMARY][VIS] process is up (VIS server PID: 1242)
[SUMMARY][VIS] gui server is up
[RUN    ] rm -rf ~/.gsql/gstore_gs*_autostart_flag
Done.
tigergraph@2089c417aa54:~$

執行到這一步,我已經啓動了gsql客戶端,並完成了一些命令行教程和演示。

tigergraph@2089c417aa54:~$ ls /home/tigergraph/
friendship.csv   hello2.gsql  hello.gsql  person.csv  tigergraph  tigergraph_coredump
tigergraph@2089c417aa54:~$ gsql
Welcome to TigerGraph Developer Edition, for non-commercial use only.
GSQL-Dev >

GSQL教程和示例

GSQL 101教程(https://docs.tigergraph.com/intro/gsql-101)教你如何創建圖模式、加載數據和運行查詢。對於完成某些操作(例如安裝自定義查詢)所花費的時間,我感到有些驚訝,但它們確實與文檔所描述的是一致的。

爲了讓你對GSQL有個直觀的感受,以下的自定義查詢演示瞭如何使用累加器、嵌套查詢和自定義查詢。

USE GRAPH social
CREATE QUERY hello2 (VERTEX<person> p) FOR GRAPH social{
  OrAccum  @visited = false;
  AvgAccum @@avgAge;
  Start = {p};
  FirstNeighbors = SELECT tgt
                   FROM Start:s -(friendship:e)-> person:tgt
                   ACCUM tgt.@visited += true, s.@visited += true;
  SecondNeighbors = SELECT tgt
                    FROM FirstNeighbors -(:e)-> :tgt
                    WHERE tgt.@visited == false
                    POST_ACCUM @@avgAge += tgt.age;
  PRINT SecondNeighbors;
  PRINT @@avgAge;
}
INSTALL QUERY hello2
RUN QUERY hello2("Tom")

GSQL的演示示例(https://docs.tigergraph.com/dev/gsql-examples)涵蓋了其他內容,包括協作過濾、PageRank、產品推薦和最短路徑算法,這些也值得研究一下。由於開發者許可只允許每個數據庫使用一個圖,所以你需要通過DROP ALL來刪除在練習中創建的社交圖數據。

GSQL圖算法庫(https://docs.tigergraph.com/graph-algorithm-library)實現了標準圖算法,並經過測試。你可以從GitHub下載這個庫(https://github.com/tigergraph/ecosys/tree/master/graph_algorithms)。除了基本算法,這個庫還提供了安裝腳本,可用於生成自定義算法。這些算法包括緊密度中心性、連通分量檢測、社區檢測、PageRank、最短路徑和三角計數。

GraphStudio和TigerGraph測試驅動

除了GSQL的命令行界面外,TigerGraph還提供了一個叫作GraphStudio的GUI。你可以通過瀏覽localhost:4142在本地實例上訪問它,如下所示。

image

TigerGraph的GraphStudio GUI可以用於設計圖模式、加載數據和探索圖。查詢使用GSQL編寫。

出於學習的目的,你可能需要了解下TigerGraph測試驅動演示(https://testdrive.tigergraph.com/main/dashboard)。它們是隻讀的圖數據庫,包括一些預定義的參數化查詢。當然,你也可以編寫自己的查詢。

包含了較大數據集(包含了數十億條邊)的三個測試驅動用例使用了Amazon EC2 r4.4xlarge(16個vCPU和122 GB RAM)實例,而包含小數據集的兩個測試驅動用例使用了更經濟的Amazon EC2 t2.xlarge(4個vCPU和16 GB RAM)實例。根據我的經驗,即使對於具有44億邊緣的反欺詐演示(如下所示),它的性能也相當不錯。
image

使用GraphStudio對包含用戶、設備和交易數據的大型(44億條邊)圖執行欺詐檢測查詢。GraphStudio和TigerGraph都運行在Amazon EC2 r4.4xlarge實例上。

TigerGraph基準測試

TigerGraph提供了一些基準測試(https://www.tigergraph.com/benchmark/),與其他幾個圖數據庫(Neo4j、Amazon Neptune、JanusGraph和ArangoDB)進行了比較,測試了數據加載時間和圖分析查詢時間,所有這些任務在TigerGraph中都可以進行並行化操作。毫不奇怪的是,因爲基準測試的設置方式偏向於TigerGraph的長處,所以TigerGraph在所有測試中均勝出,有些還勝出了一大截。其中令我印象深刻的基準測試是TigerGraph集羣可擴展性測試,當使用8臺機器時,它的速度提升了6.7倍。

在這種情況下,你需要問自己的問題是:“圖數據庫可以幫我解決哪些問題”?如果你要進行在線事務處理(OLTP),那你可能就不會關心批量加載和多跳分析查詢性能。畢竟,唯一真正重要的衡量標準是數據庫能爲應用程序做些什麼,這也是爲什麼在採用新技術時需要花些時間進行概念驗證。

image
TigerGraph集羣可擴展性測試,使用8臺機器時速度提升6.7倍。如果可擴展性可以達到完美,那麼這條線應該是直的,而且速度提升將達到8倍。

雲端的TigerGraph

在我進行這次調研時,TigerGraph發佈了一款雲產品,將於2019年在AWS上開始試用。這是對TigerGraph目前授權版AWS和Azure鏡像的一個補充。

英文原文:https://www.javaworld.com/article/3330736/application-development/tigergraph-review-a-graph-database-designed-for-deep-analytics.html?upd=1547004107229

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章