全部產品
Search
文件中心

Realtime Compute for Apache Flink:表特性

更新時間:Jul 01, 2026

本文將為您介紹表的功能特性,遠程儲存、列裁剪、謂詞下推以及日誌壓縮。

表特性概覽

  • 遠程儲存:為保障低延遲,最新資料保留在本地磁碟。較舊資料則非同步遷移至遠程儲存,以降低本機存放區成本。

  • 列裁剪:查詢時唯讀取所需列,跳過無關列,減少資料讀取量。

  • 謂詞下推:服務端根據列統計資訊跳過不匹配的資料區塊,減少網路傳輸和還原序列化開銷。

  • 日誌壓縮:使用 Arrow 原生壓縮機制,壓縮後顯著降低網路傳輸與儲存成本。

遠程儲存

遠程儲存指成本更低、可靠性更高的外部儲存系統,例如 S3、HDFS 或阿里雲 OSS。阿里雲即時資料流儲存 Fluss 預設使用 OSS 作為遠程儲存。

  • Fluss 利用遠程儲存實現資料分層與容錯。

  • 對於日誌表,遠程儲存儲存分層的日誌資料區段。

  • 對於主鍵表,遠程儲存儲存快照和變更日誌的資料區段。

遠程日誌機制

Fluss 是流式儲存系統,資料通常通過尾部讀取被消費。為保障低延遲,最新資料保留在本地磁碟。較舊資料則非同步遷移至遠程儲存,以降低本機存放區成本。

表級配置

日誌段複製到遠程後,本機複本通常會被刪除,以節省空間的。但為提升讀取效能,可選擇在本地保留最近的若干日誌段。

配置項

資料類型

預設值

說明

table.log.tiered.local-segments

整數

2

可指定在本地保留的日誌段數量。

叢集級配置

以下配置項控制日誌分層行為:

配置項

資料類型

預設值

說明

remote.log.task-interval-duration

時間間隔

1分鐘

遠程日誌管理工作的執行循環。包括複製、清理和刪除操作。設為 0 秒則禁用遠程日誌功能。

remote.log.index-file-cache-size

記憶體大小

1GB

本機快取中用於存放遠程索引檔案的總空間。

remote.log-manager.thread-pool-size

整數

4

調度遠程日誌任務的線程池大小。

remote.log.data-transfer-thread-num

整數

4

上傳和下載遠程記錄檔(資料、索引、中繼資料)所用的線程數量。

log.segment.file-size

記憶體大小

1GB

用於控制記錄檔的大小。日誌的保留和清理始終以單個檔案為單位進行,因此較大的檔案意味著更少的檔案數量。

與表層級配置table.log.tiered.local-segments共同決定本地磁碟的空間大小,預設值為1GB。

主鍵表的遠程快照

  • 主鍵表的資料按分桶(bucket)分布。每個分桶在本地僅保留一個副本,無從副本。

  • 為防止本地磁碟故障導致資料丟失,Fluss 定期產生快照並上傳至遠程儲存。

  • 快照包含資料副本和一個日誌位移量(log offset),表示快照產生後下一個待讀取的變更位置。

  • 當節點故障時,Fluss 可從遠程下載快照,並重放後續變更日誌,在其他節點上恢複資料。

  • 快照與日誌位移量保證一致性,使用戶端能無縫從全量讀取(快照)切換到增量訂閱(變更日誌),避免資料重複或丟失。

叢集級快照配置

配置項

資料類型

預設值

說明

kv.snapshot.interval

時間間隔

10分鐘

主鍵錶快照的組建循環。

kv.snapshot.scheduler-thread-num

整數

1

負責調度本機所有快照任務的線程數量。

kv.snapshot.transfer-thread-num

整數

4

上傳和下載快照檔案所用的線程數量。

kv.snapshot.num-retained

整數

1

保留已完成快照的最大數量。建議設為較大值,防止用戶端讀取過程中快照被刪除。

列裁剪

列裁剪是一種最佳化技術,查詢時唯讀取所需列,跳過無關列,減少資料讀取量。Fluss 支援流式讀取中的列裁剪 ,是業內少數能在即時資料流情境下實現該能力的系統。

  • Fluss 在日誌表和主鍵表的變更日誌中均支援列裁剪。它降低儲存 I/O、減少網路傳輸、減輕用戶端解析負擔,顯著提升查詢效能。

  • 無論批處理還是流處理,系統始終只處理必要欄位,最大化資源使用率。

計算引擎(如 Flink)在執行查詢時會分析所需列,並通知 Fluss 僅返回這些列。

SELECT id, name FROM log_table WHERE timestamp > '2023-01-01'

該查詢僅讀取id、name 和 timestamp 列。表中的其他列(如 address、status)不會從儲存載入,徹底避免無效讀取。

謂詞下推

謂詞下推是服務端最佳化,僅適用於日誌表。服務端根據每個 RecordBatch 的列統計資訊(min/max/nullCount)評估過濾謂詞,跳過不可能包含匹配行的整個 batch,減少網路 IO 和還原序列化開銷。

列統計資訊

列統計資訊在資料寫入時按 RecordBatch 粒度採集,包括每列的最小值(min)、最大值(max)和空值計數(nullCount)。統計資訊儲存在 Arrow RecordBatch 中,供服務端在讀取時評估過濾謂詞。

配置方式

通過 table.statistics.columns 參數指定需要採集統計資訊的列。可指定具體列名(推薦),或設定為 * 採集所有支援類型的列。

建表時開啟

CREATE TABLE log_table (
  order_id BIGINT,
  item_id BIGINT,
  amount INT,
  address STRING
) WITH (
  'table.statistics.columns' = 'order_id,amount'
);

對已有表追加開啟

ALTER TABLE log_table SET ('table.statistics.columns' = 'order_id,amount');
重要

僅對開啟統計後寫入的資料生效,歷史資料不受益。

支援的資料類型

以下資料類型支援列統計採集:BOOLEAN、TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE、DECIMAL、STRING、CHAR、DATE、TIME、TIMESTAMP、TIMESTAMP_LTZ。

以下資料類型不支援統計採集,配置時會自動排除:BYTES、BINARY、ARRAY、MAP、ROW。

前提條件

  • 日誌格式必須為 Arrow(table.log.format = 'arrow',預設已開啟)。

  • 必須通過 table.statistics.columns 顯式開啟列統計。

  • 僅適用於日誌表。

工作原理

讀取資料時,服務端逐 RecordBatch 評估列統計資訊與過濾謂詞。當統計資訊表明某個 batch 不可能包含匹配行時,服務端跳過該 batch,不將其發送給用戶端。Flink 用戶端仍會對接收到的資料再次執行過濾,作為安全兜底,查詢語義不變。

日誌壓縮

Fluss 使用 Arrow 原生壓縮機制,壓縮後資料仍符合 Arrow 格式標準。壓縮按列獨立執行,保留列裁剪能力,不影響查詢效能。

壓縮流程

  • 日誌表 :資料在用戶端由寫入器壓縮,以壓縮格式寫入儲存;讀取時由日誌掃描器解壓。

  • 主鍵表的變更日誌 :日誌在服務端產生,壓縮也在服務端完成。

壓縮效果

壓縮顯著降低網路傳輸與儲存成本。基準測試顯示,ZSTD 壓縮層級 3 可實現約 5:1 的壓縮比 (例如,5GB 資料壓縮至 1GB)。網路開銷減少,讀寫輸送量隨之提升。

配置方式

參數

預設配置

說明

table.log.arrow.compression.type

ZSTD

壓縮演算法:

  • NONE

  • LZ4_FRAME

  • ZSTD

table.log.arrow.compression.zstd.level

3

壓縮層級,取值為:

1 ~ 22。

配置樣本

-- 設定壓縮演算法為 ZSTD,壓縮層級為 2
CREATE TABLE log_table (
  order_id BIGINT,
  item_id BIGINT,
  amount INT,
  address STRING
) WITH (
  'table.log.arrow.compression.type' = 'ZSTD',
  'table.log.arrow.compression.zstd.level' = '2'
);
重要
  • 壓縮配置僅適用於table.log.format='arrow'的表。

  • 若設定table.log.format='indexed',壓縮配置將被忽略。