複雜場景下圖數據庫的 OLTP 與 OLAP 融合實踐

語言: CN / TW / HK

複雜場景數據處理的 OLTP 與 OLAP 融合實踐

在一些圖計算的場景下,我們會遇到同時需要處理 OLTP 和 OLAP 的問題。而本文就給了一個 OLTP 與 OLAP 融合實踐的指導思路,希望給你帶來一點啟發。

Dag Controller 介紹

Dag Controller 是 NebulaGraph 企業版的圖系統,經過反覆測試無誤後已經發布,它主要解決的是 OLTP 和 OLAP 的融合問題,以及複雜場景下的圖計算問題。

歡迎大家來詳細瞭解下:http://docs.nebula-graph.com.cn/3.2.1/graph-computing/0.deploy-controller-analytics/

下面,我對 Dag Controller 做個簡單分享,歡迎大家留言一起探討。

相信大家對 OLTP 和 OLAP 都不陌生,我這裏再簡單介紹下:OLTP 是一種快速響應、實時在線的一種數據處理方式。與之對應的 OLAP,是一種離線的、複雜場景的數據計算方式

對 NebulaGraph 來説,OLTP 有多種多樣的查詢語句,如:GOMATCH 等。OLAP 有各種各樣的圖算法,如:PageRank、Louvian、WCC、KCore、Jaccard 等算法。

OLTP 和 OLAP 並不是各自獨立存在的,舉例來説,我們可以將 MATCH 跑出來的子圖餵給 PageRank 算法,PageRank 跑出來的結果可以寫入到 NebulaGraph,繼續執行 MATCH 語句或其它算法。就像拼積木一樣,可以將各種各樣的 OLTP 和 OLAP 組裝起來,形成一種更加複雜場景的數據處理方式。

Dag Controller 就是處理這種場景的系統,它負責 OLTP、OLAP 的串聯和執行

Dag Controller 介紹

架構

Dag Controller 架構

Dag Controller 的職責:

  1. 向外部提供了 http 接口,用於 Job 的提交、停止、刪除等操作,以及系統環境的配置等。
  2. DAG 的執行:Dag Controller 在執行 DAG(有向無環圖)時,OLAP 部分會調用 NebulaGraph Analytics 系統,OLTP 部分會調用 graphd 完成 nGQL 的執行。

NebulaGraph Analytics 是 NebulaGraph 的圖計算系統,支持 PageRank、WCC、Louvain、Jaccard 等圖分析算法,支持 HDFS 和 NebulaGraph 數據源。

graphd、metad、storaged 是 NebulaGraph 中的組件,graphd 主要負責 nGQL 的解析,storaged 負責數據的存儲,metad 負責元數據的存儲。

案例

案例 1

複雜場景數據處理的 OLTP 與 OLAP 融合實踐

上圖是一個對子圖跑 PageRank 算法的 DAG 模型,首先用 nGQL 語句獲取一個子圖,然後再對這個子圖跑 PageRank 算法。

當我們的圖規模特別大的情況下,且我們只想對部分圖數據跑算法,就可以使用這種方式。

案例 2

複雜場景數據處理的 OLTP 與 OLAP 融合實踐

上圖是一個對兩類頂點計算最短路徑的模型。

首先,分別用 nGQL 分別獲取兩個類別的頂點 ID。然後再把這兩類頂點 ID 交給 ShortestPath 算法,ShortestPath 會在全圖中計算這兩類頂點之間的路徑。

每個算法是可以設置基於全圖跑算法,也可以基於子圖跑算法。

DAG 模型有多種多樣,可以根據不用的業務場景搭建不同的 DAG 模型。

技術實現

DAG 模型

DAG 指的是一個沒有迴路的有向圖。DAG 的一個實例看作是一個 Job,一個 Job 有多個 Task。

Dag Controller 中的 Task 可以是一個 nGQL,也可以是一個圖算法,如 PageRank、Louvain、SSSP 等。

Job 執行時候需要先對 Task 排序,網上有很多相關的代碼,這裏不再贅述。

並行執行

為了保障 DAG 的執行效率,多個 DAG 需要做到並行執行。同時,在一個 DAG 的內部,無上下游依賴關係的 Task 也需要並行執行。

如何做到多個 DAG 並行執行以及 Task 的並行執行?簡單的説,通過兩個線程池分別處理 DAG 和 Task

具體描述如下:

  1. 系統啟動時,分配 Job 線程池和 Task 線程池,分別處理 Job 的執行和 Task 的執行。
  2. 定時地從數據庫中獲取未執行的 Job,交由 Job 線程池運行。
  3. Job 執行時按照上下游的依賴關係對 Task 排序,然後依次判斷每個 Task 的所有上游是否執行完成,上游執行完成後將此 Task 交給 Task 線程池執行,如果上游未執行完則等待。
  4. 在 Job 執行過程中,如果 Job 線程池滿了之後,定時獲取未執行 Job 時需要做等待處理。Task 線程池滿了之後,也同樣做等待處理。

類型校驗

Task 之間的數據輸入與輸出存在數據類型校驗問題,這裏需要注意。比如:Task2 是 Task1 的下游,Task2 的輸入需要的是 int 類型,而 Task1 輸出也必須是 int 類型。

DAG 停止

在停止 Job 的時候,需要對多個並行運行的 Task 進行停止。一個 Task 的有準備階段、運行階段,並且運行階段會存在跨機器、多進程的情況。停止 Job 需要避免孤兒進程的問題。

自定義算法支持

我們支持將客户的算法當作一種 Task,用於 DAG 的搭建。首先,在系統中配置算法相關的參數信息。在執行 Job 時,由系統負責運行與 Task 相對應的算法。


謝謝你讀完本文 (///▽///)

要來近距離體驗一把圖數據庫嗎?現在可以用用 NebulaGraph Cloud 來搭建自己的圖數據系統喲,快來節省大量的部署安裝時間來搞定業務吧~ NebulaGraph 阿里雲計算巢現 30 天免費使用中,點擊鏈接來用用圖數據庫吧~

想看源碼的小夥伴可以前往 GitHub 閲讀、使用、(^з^)-☆ star 它 -> GitHub;和其他的 NebulaGraph 用户一起交流圖數據庫技術和應用技能,留下「你的名片」一起玩耍呢~