本文將介紹分區表的三種管理原則。
分區表(Partitioned Tables)
在 Fluss 中,分區表根據一個或多個分區鍵(partition keys)來組織資料,為大型資料集的查詢效能提升和可管理性提供了一種有效方式。通過分區,系統可以將資料劃分為不同的片段,每個片段對應特定的分區索引值。
對於分區表,Fluss 支援以下三種分區管理原則:
手動管理分區:使用者可以手動建立新分區或刪除已有分區。如需瞭解如何建立或刪除分區,請參見管理分區。
自動管理分區:分區會根據建表時配置的自動分區規則自動產生,到期的分區也會被自動清理,確保資料不會無限增長。詳見自動分區。
動態建立分區:分區會根據寫入表中的資料動態建立。詳見動態分區。
這三種策略是正交的,可以在同一張表上共存。
多欄位分區表(Multi-Field Partitioned Tables)
分區表(無論是主鍵表還是日誌表),都支援基於多個欄位配置分區鍵。這種方式允許使用者通過欄位值的組合來劃分資料,從而實現更細粒度的資料群組織、管理和查詢最佳化。
例如,在一個訂單(Order)主鍵表中,可以將分區鍵定義為 (date, region)。資料將會儲存在與具體組合對應的分區中,如 date=2025-04-05, region=US。在流式查詢中,使用者可以通過對資料進行過濾(如 region=US)來利用分區裁剪(partition pruning),通過分區下推(partition pushdown)提升讀取效能。
分區表的主要優勢
提升查詢效能:通過限制查詢範圍到特定分區,系統讀取的資料量減少,從而降低了查詢執行時間。
資料群組織更清晰:分區協助從邏輯上組織資料,使其更容易管理和查詢。
更好的擴充性:將巨量資料集劃分為更小、更易管理的塊,提升了系統的可擴充性。
限制條件
分區鍵的類型必須為 STRING 類型。
對於自動分區表,分區鍵可以是一個或多個欄位。如果表只有一個分區鍵,則支援自動建立分區和自動到期清理;如果有多個分區鍵,則僅支援自動到期清理。
如果該表為主鍵表,分區鍵必須是主鍵的一個子集。
自動分區規則只能在建立分區表時配置,不支援在建表後修改自動分區規則。
自動分區
樣本
自動分區規則通過表選項進行配置。以下樣本展示了如何使用 Flink SQL 建立一個名為 site_access 的表,該表支援自動分區。
CREATE TABLE site_access(
event_day STRING, --分區鍵
site_id INT, --網站ID
city_code STRING, --城市編號
user_name STRING, --使用者名稱
pv BIGINT, --頁面訪問次數
PRIMARY KEY(event_day, site_id) NOT ENFORCED
) PARTITIONED BY (event_day) WITH (
'table.auto-partition.enabled' = 'true', --啟用自動分區
'table.auto-partition.time-unit' = 'YEAR', --時間粒紋為年
'table.auto-partition.num-precreate' = '5', --預建立5個分區
'table.auto-partition.num-retention' = '2', --保留兩個歷史分區
'table.auto-partition.time-zone' = 'Asia/Shanghai' --時區為上海
);
在此樣本中,當自動分區發生時(Fluss 會在後台定期對所有表進行操作),將以 YEAR 為分區粒度預建立四個分區,並保留兩個歷史分區。時區設定為 Asia/Shanghai。
表參數
參數 | 類型 | 是否必填 | 預設值 | 備忘說明 |
table.auto-partition.enabled | Boolean | 否 | false | 是否為表啟用自動分區。預設禁用。當自動分區啟用時,表的分區將自動建立。 |
table.auto-partition.key | String | 否 | 無 | 此配置定義了在表使用多個分區鍵時用於自動分區的時間分區鍵。自動分區利用基於時間的分區鍵來自動處理分區,包括建立新分區和刪除過時分區,通過將分區的時間值與當前系統時間進行比較。如果表使用多個分區鍵(例如複合分區策略),此功能確定哪個鍵應作為自動分區決策的主要時間維度。如果表只有一個分區鍵,則無需配置此項。否則,必須指定。 |
table.auto-partition.time-unit | ENUM | 否 | DAY | 自動建立分區的時間粒紋。預設值為 'DAY'。有效值為 'HOUR', 'DAY', 'MONTH', 'QUARTER', 'YEAR'。如果值為 'HOUR',自動建立的分區格式為 yyyyMMddHH。如果值為 'DAY',自動建立的分區格式為 yyyyMMdd。如果值為 'MONTH',自動建立的分區格式為 yyyyMM。如果值為 'QUARTER',自動建立的分區格式為 yyyyQ。如果值為 'YEAR',自動建立的分區格式為 yyyy。 |
table.auto-partition.time-format | String | 否 | 基於時間單位 | 自動建立分區所使用的 |
table.auto-partition.num-precreate | Integer | 否 | 2 | 每次自動分區檢查時預建立的分區數量。例如,如果當前檢查時間為 2024-11-11 且配置值為 3,則將預建立分區 20241111, 20241112, 20241113。如果任何一個分區已存在,則跳過建立該分區。預設值為 2,表示將預建立 2 個分區。如果 'table.auto-partition.time-unit' 為 'DAY'(預設),則一個預建立分區為今天,另一個為明天。對於具有多個分區鍵的分區表,不支援預建立,如果未顯式指定,則在建立表時會自動化佈建為 0。 |
table.auto-partition.num-retention | Integer | 否 | 7 | 每次自動分區檢查時保留的歷史分區數量。例如,如果當前檢查時間為 2024-11-11,時間單位為 DAY,且配置值為 3,則將保留歷史分區 20241108, 20241109, 20241110。早於 20241108 的分區將被刪除。預設值為 7。 |
table.auto-partition.time-zone | String | 否 | 系統時區 | 自動分區的時區,預設與系統時區相同。 |
分區建置規則
自動分區表的時間單位 auto-partition.time-unit 可以取值為 HOUR, DAY, MONTH, QUARTER 或 YEAR。自動分區將使用以下格式建立分區。
時間單位 | 分區格式 | 樣本 |
HOUR | yyyyMMddHH | 2024091922 |
DAY | yyyyMMdd | 20240919 |
MONTH | yyyyMM | 202409 |
QUARTER | yyyyQ | 20241 |
YEAR | yyyy | 2024 |
預設格式可通過 table.auto-partition.time-format 覆蓋。自訂格式必須同時滿足以下所有規則:
時間欄位按從最大到最小的時間單位排序。
包含影響所配置分區粒度的所有欄位。
數字欄位使用固定寬度:年 4 位,月、日、小時各 2 位,季度 1 位。
不支援使用
[與]的可選模式段,因為每個分區值必須包含所有必需欄位。
例如,yyyy-MM-dd 是 DAY 的合法格式。MM-yyyy 欄位順序錯誤、yyyy-MM 缺少日欄位、yyyy-M-dd 月份寬度可變,均會被拒絕。產生的分區值還必須是合法的 Fluss 分區值:不超過 200 個 ASCII 字母、數字、底線或連字號,且不能以保留首碼 __ 開頭。因此 yyyy/MM/dd 無效,因為 / 不允許出現。字面文本可以用引號括起,例如 QUARTER 可使用 yyyy-'Q'Q。當自動分區鍵為 DATE 類型時,時間單位必須為 DAY,且格式必須為 yyyy-MM-dd。
關閉自動分區後,所配置的時間格式仍會保留,並繼續用於校正手動建立的分區名,但不再執行保留檢查。
Fluss 叢集配置
以下是 Fluss 叢集與自動分區相關的配置項。
選項 | 類型 | 預設值 | 描述 |
auto-partition.check.interval | Duration | 10 分鐘 | 自動分區檢查的間隔時間。預設設定為 10 分鐘,意味著每 10 分鐘檢查一次表分區狀態,以查看是否符合自動分區條件。如果不符合條件,將自動建立或刪除分區。 |
動態分區
動態分區是用戶端預設啟用的功能,允許用戶端根據寫入表的資料自動建立分區。當分區集事先未知時,此功能尤其有價值,無需手動建立分區。在處理多欄位分區時,此功能也特別有用,因為自動分區目前僅支援單欄位分區建立。
動態建立的分區數量也受 Fluss 叢集上配置的 max.partition.num 和 max.bucket.num 限制。
max.partition.num預設值 1000, 代表每張分區表最多能建立的分區數。max.bucket.num預設值128000, 代表每張表最多能支援的總 bucket 數(即 分區數 x 分桶數)。
用戶端選項
選項 | 類型 | 是否必填 | 預設值 | 描述 |
client.writer.dynamic-create-partition.enabled | Boolean | 否 | true | 是否啟用用戶端寫入器的動態分區建立。啟用後,如果分區在資料寫入時不存在,將自動建立新分區。 |
動態分區建立樣本
步驟一:建立樣本表
在左側導覽列,中,建立空白的資料查詢指令碼,輸入以下SQL建立一張以dt列為分區鍵的分區表。
CREATE TABLE IF NOT EXISTS `fluss-demo`.fluss.table_enable_dynamic_partition
(
id BIGINT
,name STRING
,dt STRING
)
PARTITIONED BY (dt)
WITH (
'client.writer.dynamic-create-partition.enabled' = 'true'
)
;驗證表當前的分區
SHOW PARTITIONS `fluss-demo`.fluss.table_enable_dynamic_partition;查詢結果表明表的分區列表為空白。
步驟二:動態插入資料
運行下列SQL,向不存在的分區插入資料。
INSERT INTO `fluss-demo`.fluss.table_enable_dynamic_partition values(1, 'hello', '20250701');步驟三:驗證分區被動態建立
再次執行SHOW PARTITIONS命令驗證分區已經被動態建立。
查詢結果顯示 partition name 列中包含一條記錄 dt=20250701,說明分區已被動態建立。