“統一”是 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 到底具備哪些能力優勢呢?

01 功能對比.png

02 性能對比

為了更直觀地展示二者在實際查詢中的表現,我們基於跨集羣的 TPC-DS 查詢場景,對比了 Doris Catalog(兩種連接模式) 與 JDBC Catalog 的執行性能。以下是測試結果概要:

02 性能對比.png

結果顯示,在涉及聚合、Join 等複雜查詢場景下,Doris Catalog 相比 JDBC Catalog 展現出不同程度的性能優勢。其中,在單表聚合查詢場景下優勢尤為突出:Doris Catalog(虛擬集羣)的查詢耗時僅為 0.21 秒,相較於 JDBC Catalog,速度提升超過 200 倍

具體測試如下

  1. 在單表簡單查詢(直接查詢遠端集羣)模式下: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;

02 性能對比-1.png

  1. 在單表聚合查詢(直接查詢遠端集羣)模式下: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;

02 性能對比-2.png

  1. 在多表關聯查詢(兩個大表分別存儲在本地和遠端集羣,進行關聯查詢)模式下: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;

02 性能對比-3.png

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 和 虛擬集羣兩種訪問模式。在瞭解具體實現之前,先了解兩種模式的區別

 Doris Catalog 核心設計.png

01 Arrow Flight 模式

01 Arrow Flight 模式.png

該模式的工作流程如下(假設本地集羣為 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 虛擬集羣模式

02 虛擬集羣模式.png

該模式的工作流程如下(假設本地集羣為 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 可有效支撐以下五大核心業務場景,精準解決跨集羣分析痛點:

  1. 多業務集羣聯合分析:如在電商場景中,交易集羣存儲訂單數據、物流集羣存儲履約數據,通過 Doris Catalog 直接關聯計算“訂單履約率”“物流時效”等核心指標,無需跨集羣數據同步。
  2. 地域分佈式集羣全局統計:如零售企業在多地域部署 Doris 集羣,通過 Doris Catalog 一站式彙總各區域銷售數據,實時計算全國總銷售額、區域佔比、用户活躍度等全局指標。
  3. 實時數據跨集羣關聯查詢:如用户行為分析場景中,通過 Doris Catalog 實時關聯用户實時行為集羣(點擊、瀏覽等)與長期用户畫像集羣,支撐個性化推薦、精準營銷等實時決策場景。
  4. 跨地域超大規劃集羣分治:不同地域的分公司採用相同的業務模式部署和使用 Doris 集羣。母公司通過 Doris Catalog 完成對全地域多集羣的集中訪問,實現超大規模業務數據管理。
  5. 跨集羣數據遷移驗證與對比分析:新舊集羣遷移過程中,通過 Doris Catalog 直接對比兩端數據一致性,無需導出導入工具,簡化遷移驗證流程,降低數據丟失風險。

接下來,我們以常見場景 1:多業務集羣聯合分析為例,實戰演示如何在 10 分鐘完成跨集羣訂單履約率分析

  1. 背景介紹 現有兩個 Doris 集羣,需跨集羣關聯計算核心業務指標:
  • 本地集羣(Trading-Cluster):存儲訂單基礎數據,庫表為 trading_db.order_info(訂單表);
  • 遠端集羣(Logistics-Cluster):存儲物流履約數據,庫表為 logistics_db.delivery_info(履約表);
  • 業務需求:計算近 7 天各訂單類型的履約率(已履約訂單數/總訂單數),支撐運營決策。
  1. 表結構定義
  • 本地訂單表 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;
      
  1. 數據準備 向兩張表分別插入測試數據(本地表 100 萬行訂單數據,遠端表 80 萬行履約數據),確保訂單 ID 存在關聯關係。

  2. 配置 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秒)
);
  1. 跨集羣查詢
  • 切換 Catalog 後查詢
    • -- 切換到遠端物流集羣的Catalog
      SWITCH logistics_ctl;
      -- 使用本地訂單庫
      USE trading_db;
      -- 關聯本地訂單表與遠端履約表,計算履約率
      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_rate
      FROM 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_rate
      FROM 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;
      
  1. 查詢結果與優化驗證
    1. 執行結果示例 實戰演示.png
    2. 優化特性驗證
      • 執行 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/doris-catalog