← 返回博客

DataFocus · 博客

一個引擎、一份副本、一種方言:Apache Doris 如何支撐 OT Flash

OT Flash 只有一個分析引擎 Apache Doris:匯入的表存成 Doris 內部表,Agent 和 MCP 的每次查詢都是一條帶回執的只讀 Doris SQL。本文講清單引擎換來什麼、付出什麼,以及何時 Trino/Hive 棧的 OT Heavy 更合適。

OT Flash 只用 Apache Doris 這一個分析引擎,原因在於 Doris 一身兼任了資料倉儲的兩個角色:既存資料,也跑查詢。Flash 因此不必在一層獨立的儲存之上,再架一層獨立的查詢引擎。對你的資料來說,這意味著兩件很具體的事。接入的業務表會匯入 Doris 內部表,Flash 處理的是一份副本,新鮮程度取決於最近一次裝載;Agent 發出的每一次表查詢,包括外部 Agent 經 MCP 發來的查詢,都是一條只讀的 Doris SQL,執行完帶著回執返回。限制同樣具體:Flash 面向一個業務域,這個業務域的資料要能放進一個分析引擎;它不附帶資料管道引擎,也不會就地查詢資料湖。已經在執行 Hadoop、Hive 或 Iceberg,又需要 ETL 或 AutoML 的團隊,DataFocus 給出的答案是 OT Heavy。

下文把這幾句話逐一落到機制上:Doris 在一套 Flash 安裝裡處於什麼位置;SQL 契約放行什麼、拒絕什麼;一個問題如何變成一條帶回執的 Doris 查詢;資料如何進來;以及單引擎設計從哪裡開始不再划算。

用 Doris 專案自己的話說,Doris 是什麼

Apache Doris 官方文件把這個專案描述為基於 MPP 的即時資料倉儲,可在大數據集上以亞秒級返回結果(Apache Doris 文件,2026 年 11 月查閱)。同一頁定義了下文反覆用到的兩個角色:

  • Frontend(FE)節點:接收請求、規劃查詢、儲存後設資料。
  • Backend(BE)節點:儲存資料並執行查詢。資料切分為分片(shard),在多個 BE 節點上儲存多份副本。

儲存角色和計算角色同在一個系統裡,這正是 Doris 能夠頂替“兩層棧”的原因。上游 Doris 還能作為查詢引擎訪問外部資料:4.x 湖倉概覽(最近更新於 2026 年 5 月)列出了 Hive、Iceberg、Hudi、Paimon 以及支援 JDBC 的資料庫作為可連線的資料來源。請記住這一點,因為 Flash 用的是前一種模式,不是後一種。

版本方面,以 Doris 下載頁 2026 年 11 月的資訊為準:仍在維護的分支是 4.1 和 4.0,更早的分支不再發布新版本,安全補丁也不例外。DataFocus 沒有說明 Flash 內建的是哪個 Doris 版本,請在你自己的安裝裡檢視。

Doris 在一套 Flash 安裝裡處於什麼位置

Flash 的手冊和 README 在三處提到 Doris,每一處都說明了設計的一個側面。

**作為內建資料來源。**r57 使用者手冊稱它為“DataFocus system Doris”。同一份資料來源列表裡還有一個外部型別“SelectDB / Doris”,用來連線你已經在執行的 Doris 叢集。匯入的資料落在內建的那一個裡。

**作為匯入資料的儲存。**Flash 的 GitHub README 寫明:Apache Doris 以內部表儲存匯入的業務資料。README 還列出了 Doris 到 S3 相容儲存的線上快照,並註明恢復快照會中斷服務。也就是說,分析資料的備份單位是一份 Doris 快照,而一次恢復就是一個維護視窗。

**作為監控頁上的兩個容器。**系統管理的指標頁列出各服務容器,Doris 以一個前端容器加一個後端容器出現,與專案的節點角色一一對應:

容器角色(我們對容器名的解讀)
df-doris-feDoris 前端:查詢規劃與後設資料
df-doris-beDoris 後端:儲存與執行
df-pgsqlPostgreSQL
df-redisRedis
df-webserver、df-biserver、df-search、df-nginxWeb、BI、搜尋與代理服務

正常執行時每個容器各有一個例項。Doris 面板顯示查詢狀態、活躍的 FE 與 BE、儲存量和內部表數量;PostgreSQL、RabbitMQ 和 Redis 作為基礎設施服務列在它旁邊。所以“一個引擎”要讀得準確:Flash 只有一個分析引擎,但不是隻有一個程序。這個設計省掉的是“查詢引擎加資料倉儲”這一對組合,而不是棧裡的其餘部分。

一個問題如何變成一條 Doris 查詢

DataFocus 的產品簡介用一句話說明了原則:“底層是真實的計算引擎(Flash 用 Apache Doris,Heavy 用 Trino 等),回答來自實際執行的 SQL……不讓大模型去‘估’數字。”每一次查詢都返回實際執行的 SQL、用到的表和一個數據指紋。

r56 Agent 與 MCP 手冊把這條原則寫成了契約。dfc_table 查詢工具在一個本體的範圍內執行一條只讀的 Doris 查詢,並強制以下規則:

  1. 識別符號用顯示名,以雙引號括起。Agent 從不直接引用物理列。
  2. **禁止 SELECT * 和 table.*。**這是許可權機制,不是程式碼風格:萬用字元可能觸及使用者已註冊列許可權之外的物理列。
  3. 關聯必須寫成顯式的 JOIN ... ON。NATURAL JOIN 和 JOIN USING 會被拒絕,於是在實際執行的 SQL 裡,關聯條件永遠看得見。
  4. **允許分析型 SQL。**多維聚合、CTE、視窗函式、CASE 和 COUNT(DISTINCT ...) 都可以用。手冊的要求是:聚合、排序和排名先在 SQL 裡做完,然後才套用行數限制。
  5. **maxRows 預設 100,上限 200。**被截斷、零行或失敗的結果,不得當成完整的統計數字來描述。
  6. 日期用 Doris 的寫法。CURRENT_DATE、DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR)、DATE_TRUNC(column, 'month')、CAST('2026-09-01' AS DATE)。SQLite 的 DATE('now', ...) 不在這份契約之內;手冊還要求你核對資料來源與會話的時區。

許可權隨本體走。Agent 只能拿到授權使用者可見的內容,越權請求被拒絕,也不透露資料是否存在。規則 1 到 3,就是這個承諾落到 SQL 層面之後仍然成立的保障。

例項:按地區和品類各取前 3 名產品

手冊給出的多維 Top 3 做法是:先聚合到要排名的粒度,再按分組維度做 ROW_NUMBER() 分割槽,並帶一個穩定的並列打破鍵,全部在服務端完成,而不是對可見行排名。按契約寫出來,顯示名均為假設,大致如下。這段查詢是示意程式碼,未實際執行:

-- 示意程式碼,未實際執行:顯示名均為假設
WITH totals AS (
  SELECT
    "Region",
    "Category",
    "Product",
    SUM("Order Amount") AS "Revenue"
  FROM "Sales Orders"
  WHERE "Order Date" >= DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR)
  GROUP BY "Region", "Category", "Product"
),
ranked AS (
  SELECT
    "Region", "Category", "Product", "Revenue",
    ROW_NUMBER() OVER (
      PARTITION BY "Region", "Category"
      ORDER BY "Revenue" DESC, "Product"
    ) AS "Rank"
  FROM totals
)
SELECT "Region", "Category", "Product", "Revenue", "Rank"
FROM ranked
WHERE "Rank" <= 3
ORDER BY "Region", "Category", "Rank";

三處細節承擔了全部重量。"Product" 這個並列打破鍵讓收入相同的產品也有確定的名次,正如手冊所要求。WHERE "Rank" <= 3 這一過濾在 Doris 內部執行,預設的 100 行限制就不可能把某個地區的第三名從末尾截掉。而且輸出天然就小:手冊自帶的同形樣例返回 36 行,遠在預設 maxRows 之內。手冊警告的失敗模式恰好相反:只查地區合計,再讓 Agent 把它當成產品排名來呈現。

返回的並不是原始結果集。行資料通過 evidenceRows 到達,這是 Agent 獲取行資料的唯一通道;隨行的還有 executionReceipt、完整性與截斷標誌,以及作為行資料指紋的 evidenceRowsSha256。數字以精確的十進位制 JSON 字串編碼,並通過 resultColumnContracts 標明型別,所以一個收入數字不會在送往答案的路上被浮點轉換抹掉精度。查詢違反契約時,工具返回帶 retryable 和 remediation 欄位的 errorCode;例如 TABLE_SCHEMA_INCOMPLETE 表示 Agent 必須先取得完整的表結構再重試。手冊還堅持:幣種、期間、訂單狀態、並列處理這些業務含義,必須在任何排名之前先定下來;單位絕不能從欄位名去猜。

如果你要把 Flash 接進其他 Agent,有一條邊界很要緊。MCP 手冊寫明,原生的 Trino、Hive 或 Hadoop 服務不屬於 Flash 的 Agent 入口,Flash 的查詢一律經過 Doris。外部 Agent 看到的因此只有一種 SQL 方言和一套許可權模型,沒有任何可以繞行的路徑。

資料如何進來,這份副本又要你付出什麼

你的資料不必事先就在 Doris 裡。r57 手冊列出的外部資料來源型別分為資料庫、API 源和 HTTP 源三組,包括 PostgreSQL、MySQL(含 MariaDB)、Oracle、IBM DB2、SQL Server、ClickHouse、Hive、Delta Lake、Iceberg、TiDB、SelectDB / Doris、OceanBase、SAP HANA、DM8 和 KingBase。表也可以從本地 CSV、Excel 或 JSON 檔案匯入。

文件記載的路徑分兩段:

  1. 連線。填寫 Source Name(資料來源名稱)、Server(伺服器)、Port(埠)、Database(資料庫)、可選的 Schema 和 JDBC Param,以及使用者名稱和密碼,然後點選 Connect 測試連線。手冊建議使用一個專用的只讀資料庫賬號,且只能訪問你打算分析的那些庫和表。
  2. **匯入。**三步向導:選擇資料來源,選擇表,再為裝載表配置匯入型別和可選的排程計劃。Table Task(表任務)標籤頁存放定時匯入任務。

因為 Doris 裡放的是副本,三條運維事實隨之而來:

  • **新鮮度由你的排程決定。**匯入的表只和最近一次裝載一樣新。設定匯入週期時,要回答的問題是“答案最多允許陳舊到什麼程度”,而不是源系統方便與否。
  • **儲存由你來規劃。**Doris 的資料盤必須裝得下你匯入的全部資料。系統要求和支援的平臺列在 GitHub 上的 OT Flash 發行說明裡;實際容量取決於資料量、併發和工作負載。
  • **影響範圍就是那個賬號。**一個範圍收窄的只讀源賬號,決定了能被拉進 Flash 的資料上限在哪裡,無論由哪個使用者來配置匯入。

轉換這件事需要說得精確。Flash 不包含資料管道引擎;產品簡介只為 Heavy 列出了資料管道。Flash 提供的是產品內的表級工具:Join Worksheet(關聯工作表)、把同結構表上下堆疊的 Merge Worksheet(合併工作表)、帶編輯器的 SQL 檢視、組合相關表的資料集,以及“norm”公式。這些工具處理的是已經在 Doris 裡的表。清洗、去重或流處理這類重活,必須在資料到達 Flash 之前完成。

上游 Doris 可以像其湖倉文件所述那樣就地查詢湖上的目錄,但 Flash 手冊沒有描述把這一模式開放給使用者。請按“連線並匯入”來規劃。

單引擎設計換掉了什麼

問題Flash:Doris 兼任計算與資料倉儲Trino/Hive/Iceberg 式的棧,如 OT Heavy
分析層的活動部件一個引擎,兩種容器角色(FE、BE)一個帶自身協調器與工作節點的查詢引擎、一個數據倉庫、一種表格式和一層儲存(Trino 文件,2026 年 11 月查閱)
資料放在哪裡複製進 Doris 內部表留在資料湖中;Trino 聯結器讓引擎適配 Hive、Iceberg 或關係型資料來源
Agent 看到的 SQL 方言僅 Doris SQLTrino 等
資料管道與 AutoML不提供ETL(DataSpring,基於 Flink)與 AutoML
分析資料的備份單位Doris 快照到 S3 相容儲存;恢復會中斷服務取決於湖和倉兩層

所得:要部署的系統更少;所有 Agent 共用一份 SQL 與許可權契約;回執指向的是一個引擎上的一次查詢。所失:資料要複製進來而不是原地讀取;新鮮度計劃由你負責;表級重塑之外的任何處理都要在上游完成。DataFocus 沒有為任何一個版本釋出效能數字,所以這張表比較的是結構,不是速度。

Flash 還是 Heavy:一條決策規則

DataFocus 對 Heavy 的描述是“沿用 Hadoop、Hive、Trino 與 Iceberg 架構,同時具備 ETL 與 AutoML”,面向資料量大、已經在用大數據平臺、還需要資料加工和建模的企業。兩個版本都包含本體管理,也都支援 Agent 通過 MCP 接入。

  • 選 Flash:目標是一個業務域,這個域的表能從容地放進一個分析引擎,你能接受按計劃重新整理的副本,並且轉換要麼在資料到達之前完成,要麼能用 Doris 裡的檢視和工作表完成。
  • 選 Heavy:資料已經在 Hive 或 Iceberg 表裡,你不想再複製一份;需要內建的 ETL 或 AutoML;或者平臺團隊已經在運維 Hadoop 級別的基礎設施,並期望分析層架在其上。

決定大多數情況的,是 Flash 規則裡的第二個條件:你這個業務域的資料,能不能以副本形式放進一個 Doris 叢集,並按你掌控的計劃重新整理?能,單引擎設計就替你省掉一層本來要運維的東西;不能,Heavy 的湖倉棧才是誠實的選擇。

下一步

到 DataFocus 下載頁對比兩個版本,再到 r56 Agent 與 MCP 手冊完整閱讀 Doris 查詢契約。