全部產品
Search
文件中心

Realtime Compute for Apache Flink:Fluss SQL連接器

更新時間:Oct 28, 2026

本文介紹如何在Realtime Compute Flink SQL 作業中讀取 Fluss 表、寫入加工結果及關聯維表。

背景資訊

阿里雲流儲存 Apache Fluss 版採用“湖流一體”架構,實現與Apache Paimon等資料湖格式的無縫對接,在確保資料高時效性的基礎上,顯著降低即時數倉的構建與營運成本。通過統一的資料流與湖倉協同機制,Fluss助力企業打破資料孤島,加速湖上資料價值的深度挖掘與高效共用。

類別

詳情

支援類型

源表、維表、結果表

運行模式

流模式和批模式

資料格式

暫不支援

API種類

SQL

是否支援更新或刪除結果表資料

是

建立自訂 Catalog

Fluss 迭代快於Realtime Compute Flink。此處提供最新的自訂 Catalog 包,用於提前體驗尚未隨 VVR 版本發布的 Fluss Catalog 功能。詳情請參考:建立自訂 Catalog

SQL

Fluss連接器可以在SQL作業中使用,作為源表,維表或者結果表。詳情請參見:引擎對接 - Flink

前提條件

  • 目前使用者對Fluss表對目標表有讀寫權限,參考授權訪問Fluss叢集。

  • 串連阿里雲流儲存Fluss叢集時,Flink工作空間和Fluss叢集需要在同一VPC內。

  • 已在 Flink 控制台建立 Fluss Catalog。

特色功能

Fluss Connector 提供以下特色功能:

功能

介紹

全增量一體化消費

支援全量、增量及全增量一體化消費。

資料探查

Fluss 支援在 Flink SQL 的批模式下對錶資料進行快速探查,這對於資料開發調試、資料驗證和問題排查非常實用。

CDC 日誌訂閱與虛擬表

Fluss 主鍵表天然支援 CDC(Change Data Capture)日誌訂閱,下遊 Flink 作業可以即時消費到完整的變更事件流(INSERT、UPDATE_BEFORE、UPDATE_AFTER、DELETE)。

Lookup Join(維表關聯)

Fluss 支援高效的 KV 點查和二級索引尋找,適合低延遲的維表關聯情境。

部分列更新(Partial Update)

只更新修改部分列的資料,而非整行更新。

Delta Join

新型的 Join 方案,能夠在保持雙流 Join 語義的同時,將資料更新行為下沉到Fluss表中完成,從而顯著降低Flink的資源消耗,提升作業的穩定性和執行效率。

Merge Engine

Fluss 主鍵表支援配置不同的 Merge Engine,用於控制相同主鍵的多條記錄如何合并。

湖流一體

將即時資料流式儲存(Fluss)與基於 Paimon 的資料湖(由 DLF 統一管理中繼資料)進行深度整合,實現“一份資料,兩種視圖”,即在同一個邏輯表中,同時提供低延遲的即時資料訪問和高吞吐的歷史資料分析能力。

分區表

支援分區表建立、讀寫資料,並可自動建立和清理分區。

新增列

支援動態新增列,同時不影響運行中的讀寫作業。

使用限制

  • 日誌表(Log Table)只能接收 INSERT 訊息,無法處理 UPDATE 和 DELETE 操作。

  • 主鍵表(PrimaryKey Table)可以處理所有類型的訊息(INSERT、UPDATE、DELETE)。

  • 維表 Lookup Join 僅支援主鍵表,Join 條件需包含全部主鍵欄位。

  • Delta Join 要求左右表均為 Fluss 主鍵表,且 Join Key 必須包含分桶鍵(Bucket Key)。

注意事項

  • Fluss 表有兩種類型:日誌表(無主鍵,類似 Kafka Topic)和主鍵表(有主鍵,支援 Upsert 語義)。請根據業務情境選擇合適的表類型。

  • 生產環境應合理配置 bucket.num,以保證資料的並行讀寫效能和資料分布均衡。

  • 對於分區表,建議合理規劃分區策略:根據資料量和查詢模式選擇合適的分區時間粒紋(如按天、按月),並通過 table.auto-partition.num-retention 控制歷史分區保留數量,避免分區數過多導致中繼資料膨脹。同時,對於主鍵表,如果資料本身具有時間或業務維度天然分區特徵,建議優先使用分區表而非將所有資料堆積在單個非分區表中。分區表不僅便於資料生命週期管理,還能在流式和批式查詢中利用分區下推(分區裁剪)大幅減少不必要的資料掃描,顯著提升查詢效能。

  • 使用 Delta Join 前,需在 Flink 作業的運行參數中配置相應參數以啟用最佳化。

特色功能詳解

全增量一體化消費

功能說明

Fluss 主鍵表支援全增量一體化消費:先讀取表中的歷史全量快照資料,全量資料讀取完畢後自動無縫切換到增量流式消費,保證資料的完整性和一致性。

消費模式

通過 scan.startup.mode 參數控制消費起始位點:

模式

說明

full

預設值。先讀取全量快照,再增量消費。適合需要完整歷史資料的情境。

earliest

從最早的日誌位點開始消費,不讀取全量快照。

latest

從最新位點開始消費,僅消費啟動後產生的新資料。

timestamp

從指定時間戳記位點開始消費,需配合 scan.startup.timestamp 參數使用。

SQL 樣本
-- 全增量一體化消費(預設模式)
SELECT * FROM `fluss_catalog`.`fluss_db`.orders;

-- 從指定時間戳記開始消費,通過 Hint 指定參數
SELECT * FROM `fluss_catalog`.`fluss_db`.orders
  /*+ OPTIONS('scan.startup.mode' = 'timestamp', 'scan.startup.timestamp' = '2025-01-01 00:00:00') */;

-- 從最新位點開始消費
SELECT * FROM `fluss_catalog`.`fluss_db`.orders
  /*+ OPTIONS('scan.startup.mode' = 'latest') */;

CDC 日誌訂閱與虛擬表

日誌訂閱

Fluss 主鍵表天然支援 CDC(Change Data Capture)日誌訂閱,下遊 Flink 作業可以即時消費到完整的變更事件流(INSERT、UPDATE_BEFORE、UPDATE_AFTER、DELETE),無需額外開啟 Binlog 配置。

這意味著:

  • 主鍵表的所有變更都會自動產生 CDC 日誌。

  • 下遊可直接訂閱 Fluss 主鍵表擷取完整的變更流,用於即時資料同步或流式 ETL。

SQL 樣本
-- 直接讀取主鍵表即可擷取 CDC 變更流
SELECT * FROM `fluss_catalog`.`fluss_db`.orders;
-- 輸出包含完整的 INSERT / UPDATE / DELETE 事件
虛擬表(Virtual Table)

除了直接訂閱 CDC 流之外,Fluss 還提供了虛擬表機制,通過在基礎資料表名後追加特定尾碼即可訪問帶有中繼資料的變更日誌,無需額外儲存資料。虛擬表是系統自動產生的,不需要使用者手動建立。

Changelog 表($changelog)

適用於主鍵表和日誌表,提供帶有中繼資料的原始變更日誌流。

表結構(在原始表欄位之外,自動附加以下中繼資料列):

中繼資料列

類型

說明

_change_type

STRING

變更類型。主鍵表可能的值:insert、update_before、update_after、delete;日誌表僅有 insert。

_log_offset

BIGINT

該條變更在日誌中的位移量。

_commit_timestamp

TIMESTAMP_LTZ

變更的提交時間戳記。

SQL 樣本:

-- 讀取 orders 表的 changelog 虛擬表
SELECT * FROM `fluss_catalog`.`fluss_db`.`orders$changelog`;

-- 通過 Hint 指定從最新位點開始消費
SELECT * FROM `fluss_catalog`.`fluss_db`.`orders$changelog`
  /*+ OPTIONS('scan.startup.mode' = 'latest') */;

-- 過濾出刪除事件
SELECT * FROM `fluss_catalog`.`fluss_db`.`orders$changelog`
WHERE _change_type = 'delete';
Binlog 表($binlog)

僅適用於主鍵表,提供包含變更前後鏡像(before/after image)的 Binlog 格式資料,便於精確擷取每次變更的前後狀態。

表結構(在中繼資料列之外,以嵌套 ROW 類型呈現變更前後的完整行資料):

列

類型

說明

_change_type

STRING

變更類型:insert、update、delete。

_log_offset

BIGINT

日誌位移量。

_commit_timestamp

TIMESTAMP_LTZ

提交時間戳記。

before

ROW

變更前的行資料。insert 時為 NULL。

after

ROW

變更後的行資料。delete 時為 NULL。

變更事件對照:

變更類型

before

after

insert

NULL

新值

update

舊值

新值

delete

舊值

NULL

SQL 樣本:

-- 讀取 users 表的 binlog 虛擬表
SELECT * FROM `fluss_catalog`.`fluss_db`.`users$binlog`;

-- 擷取更新事件中欄位變更前後的值
SELECT
  `before`.user_name AS old_name,
  `after`.user_name  AS new_name,
  _commit_timestamp  AS change_time
FROM `fluss_catalog`.`fluss_db`.`users$binlog`
WHERE _change_type = 'update';
使用限制
  • Changelog 表和 Binlog 表目前不支援投影下推、分區下推和謂詞下推。

  • Binlog 表僅適用於主鍵表,日誌表不支援。

  • 虛擬表的啟動模式支援 earliest(預設)、latest 和 timestamp,不支援 full。


部分列更新(Partial Update)

功能說明

Fluss 支援部分列更新(Partial Update),允許多個資料流獨立地向同一張主鍵寬表寫入各自關心的欄位,Fluss 引擎會自動按主鍵進列欄位層級的合并。這種方式無需在 Flink 中維護複雜的多流 Join 狀態,避免了大狀態問題。

使用情境

典型情境為即時使用者畫像寬表構建:不同的資料來源(如推薦系統、曝光日誌、點擊日誌、購物車資料)分別更新使用者畫像表中各自對應的欄位,最終形成一張完整的使用者 360 度視圖。

使用限制
  • 目標表必須為主鍵表。

  • 每個資料流的寫入欄位必須包含完整的主鍵欄位。

  • 計算拓撲中不包含多流 Join 節點,直接由 Fluss 在儲存層完成 Merge。

SQL 樣本
-- 1. 建立寬表
CREATE TABLE IF NOT EXISTS `fluss_catalog`.fluss_db.user_rec_wide (
    user_id   STRING,
    item_id   STRING,
    rec_score DOUBLE,
    imp_cnt   INT,
    click_cnt INT,
    PRIMARY KEY (user_id, item_id) NOT ENFORCED
) WITH ('bucket.num' = '3');

-- 2. 多流分別寫入各自欄位
-- 資料流 1:寫入推薦分數
INSERT INTO `fluss_catalog`.fluss_db.user_rec_wide (user_id, item_id, rec_score)
SELECT user_id, item_id, rec_score 
FROM `fluss_catalog`.fluss_db.recommendations;

-- 資料流 2:寫入曝光次數
INSERT INTO `fluss_catalog`.fluss_db.user_rec_wide (user_id, item_id, imp_cnt)
SELECT user_id, item_id, imp_cnt 
FROM `fluss_catalog`.fluss_db.impressions;

-- 資料流 3:寫入點擊次數
INSERT INTO `fluss_catalog`.fluss_db.user_rec_wide (user_id, item_id, click_cnt)
SELECT user_id, item_id, click_cnt 
FROM `fluss_catalog`.fluss_db.clicks;

上述三條 INSERT 語句可作為獨立的 Flink 作業運行,Fluss 儲存層會自動將相同主鍵的欄位合并成完整的行。


Delta Join

功能說明

Delta Join 是 Fluss 提供的新一代雙流 Join 範式,將資料更新行為下沉到 Fluss 儲存層完成,利用主鍵表和二級索引實現高效尋找,無需在 Flink 中維護 Join State。

核心優勢:

  • 無 Join State:省去冗餘的狀態儲存,避免大狀態導致的 GC 問題。

  • 低資源消耗:實測 Flink 記憶體與 CPU 限定下降超 86%。

  • 更穩定高效:避免狀態膨脹帶來的效能瓶頸。

與傳統 Join 對比

特性

傳統 Flink Join(Kafka)

Fluss Delta Join

狀態儲存

需在 Flink 緩衝全量上遊資料

無 Join State,依賴 Fluss 索引

資源消耗

高(大狀態導致 GC 頻繁)

低

穩定性

易受狀態膨脹影響

更穩定

實現機制

雙邊驅動更新

更新下沉至 Fluss 儲存層

適用情境

通用流式 Join

Fluss 主鍵表間的高效 Join

使用限制
  • 左右表必須為 Fluss 的主鍵表(支援分區表)。

  • 分桶鍵(Bucket Key)需為主鍵首碼。

  • Join Key 必須包含分桶鍵;若為分區表,還需包含分區鍵。

SQL 樣本

1. 建立表

CREATE TABLE orders (
  user_id BIGINT,
  order_date DATE,
  order_id BIGINT,
  amount DECIMAL(10, 2),
  PRIMARY KEY (user_id, order_id, order_date) NOT ENFORCED
) WITH ('bucket.key' = 'user_id, order_id');

CREATE TABLE order_enhance (
  user_id BIGINT,
  order_id BIGINT,
  risk_level TINYINT,
  is_fraud BOOLEAN,
  update_time TIMESTAMP(3),
  PRIMARY KEY (user_id, order_id) NOT ENFORCED
) WITH ('bucket.key' = 'user_id, order_id');

2. 執行 Delta Join

SELECT * FROM orders o
INNER JOIN order_enhance e
ON o.user_id = e.user_id AND o.order_id = e.order_id;

3. 通過 Hint 最佳化 Lookup 效能

SELECT * FROM orders o /*+ OPTIONS('client.lookup.queue-size'='2560') */
INNER JOIN order_enhance e /*+ OPTIONS('client.lookup.queue-size'='2560') */
ON o.user_id = e.user_id AND o.order_id = e.order_id;
作業運行參數配置

使用 Delta Join 時,需在 Flink 作業的運行參數中添加以下配置:

table.exec.delta-join.cache-enabled: 'true'
table.exec.async-lookup.buffer-capacity: '3000'
table.optimizer.delta-join.strategy: FORCE
table.exec.delta-join.left.cache-size: '100'
table.exec.delta-join.right.cache-size: '1000'

參數

說明

table.optimizer.delta-join.strategy

設為 FORCE 強制啟用 Delta Join,無法滿足條件時報錯。

table.exec.async-lookup.buffer-capacity

非同步請求緩衝容量,建議設定為千層級。

table.exec.delta-join.cache-enabled

開啟本機快取以減少對 Fluss 的請求。

table.exec.delta-join.left.cache-size

左表緩衝 Key 數量,需根據記憶體和熱點資料調整。

table.exec.delta-join.right.cache-size

右表緩衝 Key 數量,需根據記憶體和熱點資料調整。

成功啟用後,可在 Flink 作業狀態總覽中看到 Delta Join 節點,表明最佳化已生效。


Lookup Join(維表關聯)

功能說明

Fluss 主鍵表支援作為 Flink SQL 的維表使用,通過 Lookup Join 可以在流處理中即時關聯維度資料。Fluss 支援高效的 KV 點查和二級索引尋找,適合低延遲的維表關聯情境。

使用限制
  • 僅支援主鍵表作為維表。

  • Join 條件必須包含維表的全部主鍵欄位。

同步與非同步模式

模式

參數配置

說明

非同步(預設)

'lookup.async' = 'true'

高吞吐,推薦在大多數情境下使用。

同步

'lookup.async' = 'false'

逐條查詢,適合調試或低並發情境。

SQL 樣本
-- 通過 Hint 配置 Lookup 緩衝,進行維表關聯
SELECT
  o.order_id,
  o.amount,
  u.user_name,
  p.product_name
FROM `fluss_catalog`.`fluss_db`.orders AS o
LEFT JOIN `fluss_catalog`.`fluss_db`.user_dim
  /*+ OPTIONS('lookup.cache' = 'PARTIAL', 'lookup.partial-cache.expire-after-write' = '60s', 'lookup.partial-cache.max-rows' = '10000') */
  FOR SYSTEM_TIME AS OF o.proctime AS u
  ON o.user_id = u.user_id
LEFT JOIN `fluss_catalog`.`fluss_db`.product_dim
  FOR SYSTEM_TIME AS OF o.proctime AS p
  ON o.product_id = p.product_id;

-- 使用同步 Lookup 模式(適合調試情境)
SELECT o.order_id, o.amount, d.user_name
FROM `fluss_catalog`.`fluss_db`.orders AS o
LEFT JOIN `fluss_catalog`.`fluss_db`.user_dim
  /*+ OPTIONS('lookup.async' = 'false') */
  FOR SYSTEM_TIME AS OF o.proctime AS d
  ON o.user_id = d.user_id;

Merge Engine

功能說明

Fluss 主鍵表支援配置不同的 Merge Engine,用於控制相同主鍵的多條記錄如何合并。通過 table.merge-engine 參數設定,支援以下策略:

Merge Engine

說明

last_row(預設)

保留最後一條寫入的記錄,後寫入的資料覆蓋先寫入的資料。適用於大多數 Upsert 情境。

first_row

保留第一條寫入的記錄,後續相同主鍵的資料被忽略。適用於去重情境,如日誌去重。

versioned

根據指定的版本列保留版本號碼最大的記錄。需配合 table.merge-engine.versioned.ver-column 參數指定版本列。適用於需要按版本控制資料更新順序的情境。

SQL 樣本
-- 使用 first_row 實現去重
CREATE TABLE IF NOT EXISTS `fluss_catalog`.fluss_db.event_dedup (
    event_id STRING,
    event_type STRING,
    event_time TIMESTAMP(3),
    payload STRING,
    PRIMARY KEY (event_id) NOT ENFORCED
) WITH (
  'table.merge-engine' = 'first_row'
);

-- 使用 versioned 按版本列更新
CREATE TABLE IF NOT EXISTS `fluss_catalog`.fluss_db.user_profile (
    user_id BIGINT,
    user_name STRING,
    age INT,
    update_version BIGINT,
    PRIMARY KEY (user_id) NOT ENFORCED
) WITH (
  'table.merge-engine' = 'versioned',
  'table.merge-engine.versioned.ver-column' = 'update_version'
);

分區表

功能說明

Fluss 支援分區表,通過 PARTITIONED BY 將資料按分區鍵劃分到不同的物理分區中,適用於按時間或業務維度管理資料生命週期和提升查詢效能的情境。分區表支援單欄位分區和多欄位分區,並提供手動管理、自動管理和動態建立三種正交的分區管理原則。

基本規則
  • 分區鍵的資料類型需要是 STRING。

  • 主鍵表的分區鍵需要是主鍵的子集。

  • 自動分區規則僅在建表時配置,建表後不可修改。

分區管理原則

策略

說明

手動管理

使用者通過 ALTER TABLE 手動建立或刪除分區,適合分區數量有限且可控的情境。

自動管理

基於時間規則自動建立新分區並清理到期歷史分區,適合按時間維度持續寫入的情境。

動態建立

寫入資料時,若目標資料分割不存在則由用戶端自動建立,適合分區值不可預知的情境。

三種策略是正交的,可以組合使用。例如,可以同時開啟自動管理(按時間自動建立和清理)和動態建立(兜底處理未預建立的分區)。

SQL 樣本

1. 建立單欄位分區表(自動分區管理)

CREATE TABLE `fluss_catalog`.fluss_db.site_access (
  site_id BIGINT,
  user_name STRING,
  pv BIGINT,
  event_day STRING,
  PRIMARY KEY (site_id, event_day) NOT ENFORCED
) PARTITIONED BY (event_day) WITH (
  'table.auto-partition.enabled' = 'true',
  'table.auto-partition.time-unit' = 'DAY',
  'table.auto-partition.num-precreate' = '5',
  'table.auto-partition.num-retention' = '30',
  'table.auto-partition.time-zone' = 'Asia/Shanghai'
);

2. 建立多欄位分區表

CREATE TABLE `fluss_catalog`.fluss_db.region_access (
  access_id BIGINT,
  user_name STRING,
  event_date STRING,
  region STRING,
  PRIMARY KEY (access_id, event_date, region) NOT ENFORCED
) PARTITIONED BY (event_date, region) WITH (
  'table.auto-partition.enabled' = 'true',
  'table.auto-partition.key' = 'event_date',
  'table.auto-partition.time-unit' = 'DAY',
  'table.auto-partition.num-retention' = '7'
);
說明:多欄位分區時,需通過 table.auto-partition.key 指定用於自動分區的時間鍵。多欄位分區僅支援自動到期清理,不支援自動預建立(num-precreate 強製為 0)。

3. 手動管理分區

-- 查看所有分區
SHOW PARTITIONS `fluss_catalog`.fluss_db.site_access;

-- 手動添加分區
ALTER TABLE `fluss_catalog`.fluss_db.site_access
  ADD PARTITION (event_day = '20250315');

-- 手動刪除分區
ALTER TABLE `fluss_catalog`.fluss_db.site_access
  DROP PARTITION (event_day = '20250101');

4. 動態建立分區

寫入資料時,如果目標資料分割不存在,用戶端會自動建立對應分區(預設開啟):

-- 寫入資料,若分區 '20250701' 不存在則自動建立
INSERT INTO `fluss_catalog`.fluss_db.site_access
VALUES (1, 'hello', 100, '20250701');

動態建立由用戶端參數 client.writer.dynamic-create-partition.enabled(預設 true)控制,受叢集層級的 max.partition.num(預設 1000)和 max.bucket.num(預設 128000)限制。

分區下推

流式或批式查詢分區表時,Fluss 支援分區下推(分區裁剪),通過 WHERE 條件中的分區鍵過濾,僅讀取匹配的分區資料,減少不必要的 I/O 開銷:

-- 僅讀取指定日期的分區資料
SELECT * FROM `fluss_catalog`.fluss_db.site_access
WHERE event_day = '20250315';

-- 多欄位分區表按 region 過濾
SELECT * FROM `fluss_catalog`.fluss_db.region_access
WHERE region = 'US';
自動分區參數說明

參數

類型

預設值

說明

table.auto-partition.enabled

Boolean

false

是否啟用自動分區管理。

table.auto-partition.key

String

無

多分區鍵時,指定用於自動分區的時間鍵。單分區鍵時無需配置。

table.auto-partition.time-unit

Enum

DAY

自動分區的時間粒紋,可選 HOUR、DAY、MONTH、QUARTER、YEAR。

table.auto-partition.num-precreate

Integer

2

預建立的未來分區數量。多欄位分區時不支援,強製為 0。

table.auto-partition.num-retention

Integer

7

保留的歷史分區數量,超出的到期分區將被自動刪除。

table.auto-partition.time-zone

String

系統時區

自動分區使用的時區。

最佳實務
  • 選擇合適的分區粒度:根據資料量和查詢模式選擇時間粒紋。資料量大、查詢時間範圍小的情境建議按 DAY 或 HOUR;資料量較小的情境可按 MONTH 或 QUARTER。

  • 合理設定保留原則:通過 num-retention 控制歷史分區數量,避免分區數過多導致中繼資料膨脹和叢集管理負擔增大。

  • 組合使用自動管理與動態建立:自動管理負責常規的時間分區建立和清理,動態建立作為兜底機制處理異常或延遲資料。

  • 注意叢集限制:單表分區數受 max.partition.num 限制(預設 1000),總 Bucket 數受 max.bucket.num 限制(預設 128000),分區數 x bucket.num 不應超過此上限。


流式查詢下推

Fluss 採用 Apache Arrow 列式儲存格式進行日誌傳輸,支援將過濾和投影操作下推到儲存層執行,從而減少資料轉送量,查詢效能可提升高達 10 倍。

這一特性在以下情境中尤為有效:

  • 只需讀取寬表中部分列(投影下推)。

  • 需要根據條件過濾大量資料(謂詞下推)。

日誌儲存格式通過 table.log.format 參數控制,預設為 ARROW。


湖流一體

功能說明

Fluss 支援湖流一體架構,可將 Fluss 中的即時資料自動同步到資料湖(如 Apache Paimon),實現冷熱資料自動階層式存放區,兼顧即時查詢的低延遲與歷史資料的低儲存成本。

關鍵特性:

  • 自動將 Fluss 中的流式資料寫入 Paimon 湖儲存。

  • 冷熱資料自動分層,熱資料保留在 Fluss 流儲存中,冷資料沉降到 Paimon。

  • 通過統一的 Flink SQL 查詢介面同時訪問流儲存和湖儲存中的資料。

重要

如果叢集版本為 0.9-ali-7.0以上版本,且使用湖流表進行 Union Read(聯合讀取),請同步將用戶端升級至 0.9-ali-7.0 及以上版本(對應Realtime Compute引擎 VVR 11.10 及以上版本)。

配置參數

參數

類型

預設值

說明

table.datalake.enabled

Boolean

false

開啟湖儲存分層。

table.datalake.format

Enum

叢集預設值

資料湖格式,當前僅支援 paimon。

table.log.tiered.local-segments

Integer

2

開啟階層式存放區後,本地保留的日誌段數量。


資料探查

功能說明

Fluss 支援在 Flink SQL 的批模式下對錶資料進行快速探查,包括 LIMIT 查詢、主鍵點查和 COUNT(*) 統計,無需啟動持續啟動並執行流式作業即可快速查看錶中的資料。這對於資料開發調試、資料驗證和問題排查非常實用。

LIMIT 查詢

支援對主鍵表和日誌表執行 LIMIT 查詢,快速擷取表中的少量樣本資料。

-- 從主鍵表中查看前 10 條資料
SELECT * FROM `fluss_catalog`.`fluss_db`.orders LIMIT 10;

-- 從日誌表中查看前 5 條資料
SELECT * FROM `fluss_catalog`.`fluss_db`.events LIMIT 5;

-- 結合投影,僅查看部分列
SELECT order_id, amount, order_time 
FROM `fluss_catalog`.`fluss_db`.orders LIMIT 20;
主鍵點查

對於主鍵表,支援通過 WHERE 條件按主鍵進行精確點查,利用 Fluss 的 KV 儲存引擎實現毫秒級響應。

-- 按主鍵精確查詢單條記錄
SELECT * FROM `fluss_catalog`.`fluss_db`.orders
WHERE order_id = 1001;

-- 複合主鍵的點查
SELECT * FROM `fluss_catalog`.`fluss_db`.user_orders
WHERE user_id = 12345 AND order_id = 6789;
COUNT(*) 統計

支援對主鍵表執行 COUNT(*) 查詢,快速擷取表中的總記錄數。

-- 統計主鍵表中的總行數
SELECT COUNT(*) FROM `fluss_catalog`.`fluss_db`.orders;

WITH 參數

儲存參數

以下參數會持久化到表的中繼資料中。

參數

類型

預設值

是否必填

說明

bucket.num

Integer

無

否

Fluss 表的 Bucket 數量。影響資料並行讀寫的並發度。預設值採用叢集的default.bucket.number

bucket.key

String

無

否

用於資料雜湊分布的欄位,必須是主鍵的子集,多個欄位用逗號分隔。

table.log.ttl

Duration

7d

否

日誌資料的保留時間。

table.replication.factor

Integer

叢集預設值

否

日誌表副本數,不能超過 tabletServer 數量。

table.log.format

Enum

ARROW

否

日誌儲存格式,可選 ARROW(列式,支援查詢下推)或 INDEXED。

table.log.arrow.compression.type

Enum

ZSTD

否

ARROW 格式的壓縮類型,可選 NONE、LZ4_FRAME、ZSTD。

table.log.arrow.compression.zstd.level

Integer

3

否

ZSTD 壓縮層級(1-22)。

table.kv.format

Enum

COMPACTED

否

KV 儲存格式,可選 COMPACTED 或 INDEXED。

table.merge-engine

Enum

last_row

否

主鍵表的合并策略,可選 first_row、versioned、last_row。

table.merge-engine.versioned.ver-column

String

無

條件必填

merge-engine 為 versioned 時必須指定版本列名稱。

table.datalake.enabled

Boolean

false

否

是否開啟湖儲存分層。

table.datalake.format

Enum

叢集預設值

否

資料湖格式,當前僅支援 paimon。

table.log.tiered.local-segments

Integer

2

否

階層式存放區開啟後,本地保留的日誌段數量。

自動分區參數

參數

類型

預設值

是否必填

說明

table.auto-partition.enabled

Boolean

false

否

是否啟用自動分區建立。

table.auto-partition.time-unit

Enum

DAY

否

自動分區的時間粒紋,可選 YEAR、QUARTER、MONTH、DAY、HOUR。

table.auto-partition.num-precreate

Integer

2

否

檢查時預建立的未來分區數量。

table.auto-partition.num-retention

Integer

7

否

保留的歷史分區數量,超出的分區將被自動刪除。

table.auto-partition.time-zone

String

系統時區

否

自動分區使用的時區。

讀取參數(源表)

以下參數可通過 WITH 子句或 SQL Hint 配置。

參數

類型

預設值

是否必填

說明

scan.startup.mode

Enum

full

否

消費起始模式,可選 full、earliest、latest、timestamp。

scan.startup.timestamp

Long/String

無

條件必填

起始時間戳記(毫秒值或 yyyy-MM-dd HH:mm:ss 格式),僅在 scan.startup.mode 為 timestamp 時生效。

scan.partition.discovery.interval

Duration

1分鐘

否

自動探索新分區的間隔時間。設定為負值可禁用自動探索。

client.scanner.log.check-crc

Boolean

true

否

是否對訊息進行 CRC32 校正以驗證資料完整性。

client.scanner.log.max-poll-records

Integer

500

否

每次 poll() 調用返回的最大記錄數。

client.scanner.log.fetch.max-bytes

MemorySize

16mb

否

每次請求從服務端拉取的最大位元組數。

client.scanner.log.fetch.max-bytes-for-bucket

MemorySize

1mb

否

每個 Bucket 每次請求拉取的最大位元組數。

client.scanner.log.fetch.min-bytes

MemorySize

1b

否

請求響應前期望的最小位元組數。

client.scanner.log.fetch.wait-max-time

Duration

500ms

否

當未滿足最小位元組數時,服務端最大等待時間。

client.scanner.io.tmpdir

String

系統臨時目錄

否

用於存放快照和日誌段等臨時檔案的本地目錄。

client.scanner.remote-log.prefetch-num

Integer

4

否

遠程日誌段預拉取數量。

client.remote-file.download-thread-num

Integer

3

否

下載遠程檔案的線程數。

寫入參數(結果表)

以下參數可通過 WITH 子句或 SQL Hint 配置。

參數

類型

預設值

是否必填

說明

sink.ignore-delete

Boolean

false

否

是否忽略 DELETE 和 UPDATE_BEFORE 訊息。

sink.bucket-shuffle

Boolean

true

否

寫入前是否按 Bucket ID 進行資料 Shuffle,以提升寫入效率。

client.writer.buffer.memory-size

MemorySize

64mb

否

內部緩衝行資料的總記憶體大小。

client.writer.batch-size

MemorySize

2mb

否

同一 Bucket 內記錄的目標批次大小。

client.writer.buffer.wait-timeout

Duration

Long.MAX

否

Writer 等待可用 Segment 的最大阻塞時間。

client.writer.batch-timeout

Duration

100ms

否

積攢記錄後發送批次的最大等待時間。

client.writer.bucket.no-key-assigner

Enum

STICKY

否

無主鍵表的 Bucket 分配策略,可選 STICKY 或 ROUND_ROBIN。

client.writer.acks

String

all

否

寫入確認層級。all(或 -1):等待所有副本確認;1:Leader 確認即返回;0:不等待確認。推薦使用 all。

client.writer.request-max-size

MemorySize

10mb

否

單個請求的最大位元組數。

client.writer.retries

Integer

MAX_VALUE

否

因可重試錯誤導致發送失敗時的重試次數。

client.writer.enable-idempotence

Boolean

true

否

是否開啟等冪寫入,保證 Exactly-Once 語義和順序性。

client.writer.max-inflight-requests-per-bucket

Integer

5

否

每個 Bucket 的最大未確認請求數(等冪寫入開啟時生效)。

維表參數

參數

類型

預設值

是否必填

說明

lookup.async

Boolean

true

否

是否啟用非同步 Lookup,提升維表關聯輸送量。

lookup.cache

Enum

NONE

否

緩衝策略,可選 NONE(不緩衝)或 PARTIAL(部分緩衝)。

lookup.max-retries

Integer

3

否

Lookup 失敗時的最大重試次數。

lookup.partial-cache.expire-after-access

Duration

無

否

訪問後的緩衝到期時間。

lookup.partial-cache.expire-after-write

Duration

無

否

寫入後的緩衝到期時間。

lookup.partial-cache.cache-missing-key

Boolean

true

否

是否緩衝未命中的 Key(緩衝 null 值)。

lookup.partial-cache.max-rows

Long

無

否

緩衝的最大行數。

client.lookup.queue-size

Integer

25600

否

待處理的 Lookup 操作隊列大小。

client.lookup.max-batch-size

Integer

128

否

合并多個 Lookup 操作的最大批次大小。

client.lookup.max-inflight-requests

Integer

128

否

最大未確認 Lookup 請求數。

client.lookup.batch-timeout

Duration

100ms

否

填滿 Lookup 批次前的最大等待時間。