1. 程式人生 > 程式設計 >walrus - 一個輕量級adhoc查詢框架

walrus - 一個輕量級adhoc查詢框架

背景

adhoc查詢、資料分析、ETL開發可能有60%-80%的時間消耗在了整合不同的資料來源生成特定的資料格式,簡單來說可能就是在寫這樣一條sql:

SELECT 
    col_1,col_x..,AGGREGATE_FUNC(metric_1)..
FROM hdfs_table_1 a
 JOIN mysql_table_1 b ON a.xxx=b.xxx
 JOIN hdfs_table_2 c ON b.xxx=c.xxx
GROUP BY col_1...
UNION
SELECT 
    col_2,col_y..,AGGREGATE_FUNC(metric_2)..
FROM
hdfs_table_3 a1 JOIN hdfs_table_4 b1 ON a1.xxx=b1.xxx GROUP BY col_2... UNION ... 複製程式碼

對這類重複性比較高、簡單卻維護成本高的工作,walrus的目標是

  • 資料統一管理,最大限度的減少運維成本。
  • 計算可配置化,最大限度的減少程式碼開發。

簡介

walrus是一個輕量級olap查詢框架。它支援多源異構資料來源(hdfs,mysql,clickhouse,kylin,druid...),採用apache spark作為聚合計算引擎,在雪花模型上通過json提供ETL建模和ad hoc資料查詢服務。

Architecture

Walrus Architecture

walrus包含walrus_server、online_runner、offline_runner三個程式:

  • walrus_server: spring boot web程式,處理使用者元資料管理、任務查詢等請求。
  • online_runner: spark常駐程式。按需預先申請資源並快取資料,實時監聽、處理walrus_server的online task請求。當查詢滿足online資料時,任務會優先提交到online_runner。
  • offline_runner: spark離線任務,由walrus_server通過本地(spark-submit)或者thrift api提交。

Features

  • code-less: 配置化etl、ad hoc query,可以減少開發、分析等人員80%(拍腦袋得出的數字)左右的工作量。
  • Heterogeneous data source integration: 異構資料來源聯合查詢,高效整合各個資料來源。
  • High maintainability metadata management: 高可維護性元資料管理,資料口徑、計算邏輯統一管理。
  • High scalability: 所有節點無狀態,支援水平擴充套件。
  • High performance: 通過預快取資料、合理切割任務、自定義查詢計劃重寫(查詢分支合併、資料傾斜優化...)等提供高效能查詢服務。

Design

Execution

walrus的執行過程:先解析查詢成查詢計劃,對查詢計劃進行優化重寫,最後翻譯成spark sql樹並提交到spark執行。

Walrus Query plan

  • 解析器(parser): 根據meta把query解析成查詢計劃。你也可以定製自己的parser

  • 查詢計劃(Logic Plan): 一棵join+union的巢狀樹:

    Walrus Query plan

  • 優化器(optimizer): 對查詢計劃樹進行重寫,預設的有分割槽合併優化器、資料join傾斜優化器。您可以根據自身的業務資料特點新增自己的optimizer

Metadata

簡單來說,Walrus metadata是對雪花模型的抽象。具體定義可參考pb檔案。

  • 檢視(view): 一棵join+union的巢狀樹,可以做到對事實表和維度表的多層次自由組合。

Walrus Query plan

  • 事實表(table)、維度表(dict): 業務事實表和關聯維度表。

  • 分割槽(partition):事實表,維度表根據時間跨度和資料量按全量(A)、年(Y)、月(M)、天(D)、小時(H)分割槽。分割槽方式決定了任務的拆分粒度和並行度,所以合理選擇分割槽方式可以提高計算效率。

    • 維度指標等資訊各個分割槽單獨儲存,能減少歷史重跑、業務變更等運維壓力。
    • 每個分割槽資料分版本(tablet)儲存,讀寫分離。
  • 維度(dimension)、指標(metric): 除了常規的名稱、型別等資訊外,維度、指標還可以指定計算邏輯(derivedMode:select[直接select],derived[派生],virtual[虛擬欄位],join[關聯])。指標目前支援的聚合函式有SUM,MIN,MAX,COUNT,COUNT_DISTINCT,COLLECT_LIST等,你也可以在aggregation包下實現你自己的聚合函式。

歡迎

如果有興趣的話一起來完善walrus吧:github.com/WalrusOlap/…