天天看點

複雜場景資料處理的 OLTP 與 OLAP 融合實踐

作者:NebulaGraph

本文首發于 NebulaGraph 公衆号

複雜場景資料處理的 OLTP 與 OLAP 融合實踐

Dag Controller 介紹

Dag Controller 是 NebulaGraph 企業版的系統,經過反複測試無誤後進行了釋出,它主要解決的是 OLTP 和 OLAP 的融合問題,以及複雜場景下的圖計算問題。也歡迎大家來詳細了解下:https://docs.nebula-graph.com.cn/3.2.1/graph-computing/0.deploy-controller-analytics/。

下面是我對 Dag Controller 做的一些分享,歡迎大家留言一起探讨。

相信大家對 OLTP 和 OLAP 都不陌生,我這裡再簡單介紹下:** OLTP 是一種快速響應、實時線上的一種資料處理方式。與之對應的 OLAP,是一種離線的、複雜場景的資料計算方式**。對 NebulaGraph 來說,OLTP 有多種多樣的查詢語句,如:go、match 等。OLAP 有各種各樣的圖算法,如:pagerank、louvian、wcc、kcore、jaccard 等。

OLTP 和 OLAP 并不是一個一個獨立存在的,舉例來說,我們可以将 match 跑出來的子圖喂給 pagerank 算法,pagerank 跑出來的結果可以寫入到 NebulaGraph,繼續執行 match 語句或其它算法。就像拼積木一樣,可以将各種各樣的 OLTP 和 OLAP 組裝起來,形成一種更加複雜場景的資料處理方式。

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

複雜場景資料處理的 OLTP 與 OLAP 融合實踐

架構

複雜場景資料處理的 OLTP 與 OLAP 融合實踐

Dag Controller 的職責:

1)向外部提供了 http 接口。

用于 Job 的送出、停止、删除等操作,以及系統環境的配置等。

2)DAG 的執行。

Dag Controller 在執行 DAG 時,OLAP 部分會調用 NebulaGraph Analytics 系統,OLTP 部分會調用 graphd 完成 nGQL 的執行。

NebulaGraph Analytics 是我們的圖計算系統,支援 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 交流群可以添加微信小助手 NebulaGraphbot,NebulaGraph 小助手會拉你進群~~

NebulaGraph 的開源位址:https://github.com/vesoft-inc/nebula 覺得使用體驗還不錯的話,給我們的 GitHub 點個 ❤️ 鼓勵下開源路上的我們呢~

繼續閱讀