本文將為您介紹表的功能特性,遠程儲存、列裁剪、謂詞下推以及日誌壓縮。
表特性概覽
遠程儲存
遠程儲存指成本更低、可靠性更高的外部儲存系統,例如 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 | 用於控制記錄檔的大小。日誌的保留和清理始終以單個檔案為單位進行,因此較大的檔案意味著更少的檔案數量。 與表層級配置 |
主鍵表的遠程快照
主鍵表的資料按分桶(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 | 壓縮演算法:
|
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',壓縮配置將被忽略。