“統一”是 Apache Doris 長期以來秉持的設計理念之一。在這一理念指引下,構建完善的 Catalog 生態是實現異構數據源統一查詢分析的關鍵。目前,Doris 已支持 Iceberg、Paimon、Hudi 等數據湖 Catalog,以及 JDBC Catalog,用户無需遷移數據,即可對不同數據湖和傳統數據庫進行聯邦查詢分析。
本文聚焦 Doris 多集羣間的查詢分析。實現跨 Doris 集羣的分析通查需要通過 JDBC Catalog,但該方式存在明顯短板,比如協議開銷較大、無法複用 Doris 查詢優化策略、查詢性能受限等等。同時,隨着生產環境中多 Doris 集羣部署愈加普遍,跨集羣的數據聯動分析需求也日益增長。在這種情況下,JDBC Catalog 很難滿足用户的性能要求。
為此,Apache Doris 4.0.2 版本推出重磅特性:Doris Catalog。該功能專為跨 Doris 集羣聯邦分析設計,支持通過 Arrow Flight 和虛擬集羣兩種模式,進行更高效、更貼合原生優化的跨集羣查詢。
特此説明:Doris Catalog 當前為實驗性特,歡迎大家體驗並反饋,我們將持續優化
Doris Catalog vs. JDBC Catalog
JDBC Catalog 主要藉助 MySQL 兼容的 JDBC 協議訪問其他 Doris 集羣數據。由前文可知,該方式在跨集羣大數據量交互時性能受限,難以滿足聯邦分析高吞吐與低延遲的性能要求。不同於 JDBC Catalog 的交互方式, Doris Catalog 通過 Arrow Flight 或虛擬集羣這兩種方式,能夠直接、高效的訪問其他 Doris 集羣,進行多集羣聯邦分析。
01 功能對比
那麼,與 JDBC Catalog 相比,Doris Catalog 到底具備哪些能力優勢呢?
02 性能對比
為了更直觀地展示二者在實際查詢中的表現,我們基於跨集羣的 TPC-DS 查詢場景,對比了 Doris Catalog(兩種連接模式) 與 JDBC Catalog 的執行性能。以下是測試結果概要:
結果顯示,在涉及聚合、Join 等複雜查詢場景下,Doris Catalog 相比 JDBC Catalog 展現出不同程度的性能優勢。其中,在單表聚合查詢場景下優勢尤為突出:Doris Catalog(虛擬集羣)的查詢耗時僅為 0.21 秒,相較於 JDBC Catalog,速度提升超過 200 倍。
具體測試如下:
- 在單表簡單查詢(直接查詢遠端集羣)模式下:Doris Catalog 與 JDBC Catalog 基本持平。
SELECT
ss_sold_date_sk,
ss_store_sk,
ss_item_sk,
ss_ticket_number,
ss_quantity,
ss_sales_price,
ss_ext_sales_price,
ss_net_profit
FROM jdbc_mode.tpcds100.store_sales
WHERE ss_sold_date_sk = 2450816
AND ss_store_sk = 10
AND ss_quantity BETWEEN 1 AND 3
LIMIT 100;
- 在單表聚合查詢(直接查詢遠端集羣)模式下:Doris Catalog 兩種模式均優於 JDBC Catalog,Doris Catalog(虛擬集羣)的查詢耗時僅為 0.21 秒,相較於 JDBC Catalog,速度提升超過 200 倍。
SELECT
ss_sold_date_sk,
ss_store_sk,
SUM(ss_ext_sales_price) AS total_sales,
SUM(ss_net_profit) AS total_profit,
COUNT(*) AS txn_cnt
FROM tpcds100.store_sales
WHERE ss_sold_date_sk BETWEEN 2450816 AND 2451179
GROUP BY
ss_sold_date_sk,
ss_store_sk
ORDER BY
ss_sold_date_sk,
ss_store_sk
LIMIT 100;
- 在多表關聯查詢(兩個大表分別存儲在本地和遠端集羣,進行關聯查詢)模式下:Doris Catalog 兩種模式均優於 JDBC Catalog,相較於 JDBC Catalog,速度提升約 42%。
SELECT count(ss_item_sk), count(store_sales_amt), count(catalog_sales_amt) FROM
(
SELECT
ss.ss_item_sk as ss_item_sk,
SUM(ss.ss_ext_sales_price) AS store_sales_amt,
SUM(cs.cs_ext_sales_price) AS catalog_sales_amt
FROM internal.tpcds100.store_sales ss
JOIN external.tpcds100.catalog_sales cs
ON ss.ss_item_sk = cs.cs_item_sk
WHERE ss.ss_sold_date_sk BETWEEN 2450815 AND 2451079
AND cs.cs_sold_date_sk BETWEEN 2450815 AND 2451079
GROUP BY ss.ss_item_sk) x;
03 方案選擇
由上可知,不同的查詢場景中,需要選擇適合的的訪問模式,以獲取最佳的查詢性能:
- 對於複雜 Join/Agg 查詢或依賴 Doris 內表優化特性時,優先選擇 Doris Catalog 虛擬集羣模式。
- 對於簡單單表查詢、UNION 查詢、遠端集羣規模大且無需複雜 Join 優化或 Doris 集羣版本不一致,優先選擇 Doris Catalog Arrow Flight 模式。
Doris Catalog 核心設計
Doris Catalog 本質是跨集羣訪問的“中間代理”,核心職責包括:
- 元數據同步:通過 HTTP 協議從遠端 Doris 集羣 FE 拉取表結構、分區、副本、 Tablet 位置等元數據;
- 執行計劃生成:根據訪問模式,將用户查詢轉換為適配遠端集羣的執行計劃;
- 數據路由與傳輸:協調本地 BE 與遠端 BE 進行數據傳輸,支持並行拉取與分片處理;
- 結果聚合:將遠端返回的數據聚合後,返回給用户或上層應用。
Doris Catalog 支持 Arrow Flight 和 虛擬集羣兩種訪問模式。在瞭解具體實現之前,先了解兩種模式的區別:
01 Arrow Flight 模式
該模式的工作流程如下(假設本地集羣為 ClusterA,遠端集羣為 ClusterB):
- 查詢規劃:ClusterA 的 FE 節點先進行完整的查詢規劃,針對存儲在 ClusterB 中的表,生成
RemoteDorisScanNode節點。RemoteDorisScanNode會生成一條應用謂詞下推規則後的單表查詢 SQL,通過 HTTP 協議向 ClusterB 的 FE 節點發送並執行這條 Arrow Flight SQL。 - 查詢計劃執行:ClusterA 的 FE 節點將物理執行計劃發送給 ClusterA 的 BE 節點,並告知 BE 節點 Arrow Flight 的數據流獲取位置。
- 數據查詢與傳輸:ClusterA 的 BE 節點的 Scan Node 通過 Arrow Flight 協議直接從 ClusterB 的 BE 節點獲取 Arrow Flight SQL 的執行結果。然後在 ClusterA 中執行 Join、Agg 等其他算子,並返回最終結果。
02 虛擬集羣模式
該模式的工作流程如下(假設本地集羣為 ClusterA,遠端集羣為 ClusterB):
- 元數據同步:ClusterA 的 FE 節點通過 HTTP 協議同步 ClusterB 中完整的元數據,包括表結構、分區、副本、Tablet 位置等。
- 查詢規劃:ClusterA 的 FE 節點將 ClusterB 的 BE 節點視為“虛擬 BE”,生成全局統一的執行計劃(與單集羣查詢邏輯一致)。
- 查詢計劃執行:執行計劃會將 ClusterA 與 ClusterB 的 BE 節點視作一個統一 BE 集羣,並在其上執行查詢計劃。因此,各類算子會同時在 ClusterA 和 ClusterB 的 BE 節點中執行。
- 數據查詢與傳輸:ClusterA 與 ClusterB 的 BE 節點間使用內部通信協議進行數據交互。
實戰演示:10 分鐘完成跨集羣訂單履約率分析
迴歸到實際使用中,Doris Catalog 可有效支撐以下五大核心業務場景,精準解決跨集羣分析痛點:
- 多業務集羣聯合分析:如在電商場景中,交易集羣存儲訂單數據、物流集羣存儲履約數據,通過 Doris Catalog 直接關聯計算“訂單履約率”“物流時效”等核心指標,無需跨集羣數據同步。
- 地域分佈式集羣全局統計:如零售企業在多地域部署 Doris 集羣,通過 Doris Catalog 一站式彙總各區域銷售數據,實時計算全國總銷售額、區域佔比、用户活躍度等全局指標。
- 實時數據跨集羣關聯查詢:如用户行為分析場景中,通過 Doris Catalog 實時關聯用户實時行為集羣(點擊、瀏覽等)與長期用户畫像集羣,支撐個性化推薦、精準營銷等實時決策場景。
- 跨地域超大規劃集羣分治:不同地域的分公司採用相同的業務模式部署和使用 Doris 集羣。母公司通過 Doris Catalog 完成對全地域多集羣的集中訪問,實現超大規模業務數據管理。
- 跨集羣數據遷移驗證與對比分析:新舊集羣遷移過程中,通過 Doris Catalog 直接對比兩端數據一致性,無需導出導入工具,簡化遷移驗證流程,降低數據丟失風險。
接下來,我們以常見場景 1:多業務集羣聯合分析為例,實戰演示如何在 10 分鐘完成跨集羣訂單履約率分析。
- 背景介紹
現有兩個 Doris 集羣,需跨集羣關聯計算核心業務指標:
- 本地集羣(Trading-Cluster):存儲訂單基礎數據,庫表為
trading_db.order_info(訂單表); - 遠端集羣(Logistics-Cluster):存儲物流履約數據,庫表為
logistics_db.delivery_info(履約表); - 業務需求:計算近 7 天各訂單類型的履約率(已履約訂單數/總訂單數),支撐運營決策。
- 表結構定義
-
本地訂單表
trading_db.order_info:CREATE TABLE trading_db.order_info (
order_id STRING COMMENT '訂單ID', order_type STRING COMMENT '訂單類型:實物訂單/虛擬訂單', create_time DATETIME COMMENT '創建時間', amount DECIMAL(10,2) COMMENT '訂單金額') ENGINE=OLAP
DUPLICATE KEY(order_id)
PARTITION BY RANGE(create_time) (PARTITION p202511 VALUES [('2025-11-01 00:00:00'), ('2025-12-01 00:00:00')))
DISTRIBUTED BY HASH(order_id) BUCKETS 10; -
遠端履約表
logistics_db.delivery_info:CREATE TABLE logistics_db.delivery_info (
order_id STRING COMMENT '訂單ID', delivery_status TINYINT COMMENT '履約狀態:1-已履約,0-未履約', delivery_time DATETIME COMMENT '履約時間') ENGINE=OLAP
DUPLICATE KEY(order_id)
PARTITION BY RANGE(delivery_time) (PARTITION p202511 VALUES [('2025-11-01 00:00:00'), ('2025-12-01 00:00:00')))
DISTRIBUTED BY HASH(order_id) BUCKETS 10; - 數據準備
向兩張表分別插入測試數據(本地表 100 萬行訂單數據,遠端表 80 萬行履約數據),確保訂單 ID 存在關聯關係。 - 配置 Doris Catalog
在本地 Doris 集羣執行以下 SQL,創建連接遠端物流集羣的 Catalog(虛擬集羣模式):
-- 創建Doris Catalog,啓用虛擬集羣模式(複用內表優化)
CREATE CATALOG IF NOT EXISTS logistics_ctl PROPERTIES (
'type' = 'doris', -- 固定類型
'fe_http_hosts' = 'http://logistics-fe1:8030,http://logistics-fe2:8030', -- 遠端FE HTTP地址
'fe_arrow_hosts' = 'logistics-fe1:8040,http://logistics-fe2:8040', -- 遠端FE Arrow Flight地址
'fe_thrift_hosts' = 'logistics-fe1:9020,http://logistics-fe2:9020', -- 遠端FE Thrift地址
'use_arrow_flight' = 'false', -- false=虛擬集羣模式,true=Arrow Flight模式
'user' = 'doris_admin', -- 遠端集羣登錄用户
'password' = 'Doris@123456', -- 遠端集羣登錄密碼
'compatible' = 'false', -- 集羣版本接近(4.0.3 vs 4.0.2),無需兼容
'query_timeout_sec' = '30' -- 延長查詢超時時間(默認15秒)
);
- 跨集羣查詢
-
切換 Catalog 後查詢
-- 切換到遠端物流集羣的Catalog
SWITCH logistics_ctl;
-- 使用本地訂單庫
USE trading_db;
-- 關聯本地訂單表與遠端履約表,計算履約率
SELECTo.order_type, COUNT(DISTINCT o.order_id) AS total_orders, COUNT(DISTINCT CASE WHEN d.delivery_status = 1 THEN o.order_id END) AS delivered_orders, ROUND(COUNT(DISTINCT CASE WHEN d.delivery_status = 1 THEN o.order_id END) / COUNT(DISTINCT o.order_id), 4) * 100 AS delivery_rateFROM internal.trading_db.order_info o
JOIN delivery_info d ON o.order_id = d.order_id
WHERE o.create_time >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
GROUP BY o.order_type
ORDER BY delivery_rate DESC; -
全限定名查詢
SELECT
o.order_type, COUNT(DISTINCT o.order_id) AS total_orders, COUNT(DISTINCT CASE WHEN d.delivery_status = 1 THEN o.order_id END) AS delivered_orders, ROUND(COUNT(DISTINCT CASE WHEN d.delivery_status = 1 THEN o.order_id END) / COUNT(DISTINCT o.order_id), 4) * 100 AS delivery_rateFROM internal.trading_db.order_info o
JOIN logistics_ctl.logistics_db.delivery_info d ON o.order_id = d.order_id
WHERE o.create_time >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
GROUP BY o.order_type
ORDER BY delivery_rate DESC; -
查詢結果與優化驗證
- 執行結果示例
-
優化特性驗證
- 執行
EXPLAIN查看執行計劃,可發現: - 虛擬集羣模式下,執行計劃中遠端表掃描節點為
VOlapScanNode(與本地表一致),説明覆用了 Doris 內表掃描優化; - Join 操作中自動啓用
Runtime Filter,減少遠端數據傳輸量。
- 執行
- 執行結果示例
總結與展望
Doris Catalog 的推出,補齊了 Doris 跨集羣聯邦查詢的性能短板。在此特別感謝社區同學的 Chen768959 和 HonestManXin 貢獻,幫助延續了 Doris Catalog 生態“無需遷移、一站式分析”的核心優勢,讓多 Doris 集羣從“數據孤島”變為“互聯一體”。
作為實驗性特性,Doris Catalog 後續將持續迭代優化:
- 增強 Arrow Flight 模式,使其能夠訪問任意支持標準 Arrow Flight 協議的數據源。
- 降低虛擬集羣模式 FE 內存開銷,優化元數據存儲和同步策略;
- 支持存算分離部署的 Doris 集羣(虛擬集羣模式)
- 新增更多監控指標,方便排查跨集羣查詢故障。
更多信息,請訪問 Doris 官網文檔:
https://doris.apache.org/zh-CN/docs/4.x/lakehouse/catalogs/do...