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-fe | Doris 前端:查詢規劃與後設資料 |
df-doris-be | Doris 後端:儲存與執行 |
df-pgsql | PostgreSQL |
df-redis | Redis |
df-webserver、df-biserver、df-search、df-nginx | Web、BI、搜尋與代理服務 |
正常執行時每個容器各有一個例項。Doris 面板顯示查詢狀態、活躍的 FE 與 BE、儲存量和內部表數量;PostgreSQL、RabbitMQ 和 Redis 作為基礎設施服務列在它旁邊。所以“一個引擎”要讀得準確:Flash 只有一個分析引擎,但不是隻有一個程序。這個設計省掉的是“查詢引擎加資料倉儲”這一對組合,而不是棧裡的其餘部分。
一個問題如何變成一條 Doris 查詢
DataFocus 的產品簡介用一句話說明了原則:“底層是真實的計算引擎(Flash 用 Apache Doris,Heavy 用 Trino 等),回答來自實際執行的 SQL……不讓大模型去‘估’數字。”每一次查詢都返回實際執行的 SQL、用到的表和一個數據指紋。
r56 Agent 與 MCP 手冊把這條原則寫成了契約。dfc_table 查詢工具在一個本體的範圍內執行一條只讀的 Doris 查詢,並強制以下規則:
- 識別符號用顯示名,以雙引號括起。Agent 從不直接引用物理列。
- **禁止
SELECT *和table.*。**這是許可權機制,不是程式碼風格:萬用字元可能觸及使用者已註冊列許可權之外的物理列。 - 關聯必須寫成顯式的
JOIN ... ON。NATURAL JOIN和JOIN USING會被拒絕,於是在實際執行的 SQL 裡,關聯條件永遠看得見。 - **允許分析型 SQL。**多維聚合、CTE、視窗函式、
CASE和COUNT(DISTINCT ...)都可以用。手冊的要求是:聚合、排序和排名先在 SQL 裡做完,然後才套用行數限制。 - **
maxRows預設 100,上限 200。**被截斷、零行或失敗的結果,不得當成完整的統計數字來描述。 - 日期用 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 檔案匯入。
文件記載的路徑分兩段:
- 連線。填寫 Source Name(資料來源名稱)、Server(伺服器)、Port(埠)、Database(資料庫)、可選的 Schema 和 JDBC Param,以及使用者名稱和密碼,然後點選 Connect 測試連線。手冊建議使用一個專用的只讀資料庫賬號,且只能訪問你打算分析的那些庫和表。
- **匯入。**三步向導:選擇資料來源,選擇表,再為裝載表配置匯入型別和可選的排程計劃。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 SQL | Trino 等 |
| 資料管道與 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 查詢契約。