Shared-data 集群的 Compaction
本主题介绍如何在 StarRocks shared-data 集群中管理 compaction。
概述
StarRocks 中的每次数据加载操作都会生成一个新版本的数据文件。Compaction 将不同版本的数据文件合并成更大的文件,从而减少小文件数量并提高查询效率。
Compaction Score
概述
Compaction Score 反映了分区中数据文件的合并状态。分数越高表示合并进度越慢,意味着该分区有更多未合并的数据文件版本。FE 维护每个分区的 Compaction Score 信息,包括 Max Compaction Score(分区中所有 Tablet 的最高分数)。
如果分区的 Max Compaction Score 低于 FE 参数 lake_compaction_score_selector_min_score
(默认值:10),则认为该分区的 compaction 已完成。Max Compaction Score 超过 100 表示 compaction 状态不健康。当分数超过 FE 参数 lake_ingest_slowdown_threshold
(默认值:100)时,系统会降低该分区的数据加载事务提交速度。如果超过 lake_compaction_score_upper_bound
(默认值:2000),系统将加载该分区的导入事务。
计算规则
通常,每个数据文件对 Compaction Score 贡献 1。例如,如果一个分区有一个 Tablet,并且第一次加载操作生成了 10 个数据文件,则该分区的 Max Compaction Score 为 10。Tablet 中事务生成的所有数据文件都分组为一个 Rowset。
在分数计算期间,Tablet 的 Rowset 按大小分组,文件数最多的组决定 Tablet 的 Compaction Score。
例如,一个 Tablet 经历了 7 次加载操作,生成了大小为:100 MB、100 MB、100 MB、10 MB、10 MB、10 MB 和 10 MB 的 Rowset。在计算期间,系统会将三个 100 MB 的 Rowset 分为一组,四个 10 MB 的 Rowset 分为另一组。Compaction Score 基于文件较多的组计算。在这种情况下,第二组具有更大的 compaction score。Compaction 优先处理得分较高的组,因此在第一次 compaction 后,Rowset 分布将变为:100 MB、100 MB、100 MB 和 40 MB。
Compaction 工作流程
对于 shared-data 集群,StarRocks 引入了一种新的 FE 控制的 compaction 机制
- 分数计算:Leader FE 节点基于事务发布结果计算和存储分区的 Compaction Score。
- 候选选择:FE 选择 Max Compaction Score 最高的作为 compaction 候选分区。
- 任务生成:FE 为选定的分区启动 compaction 事务,生成 Tablet 级别的子任务,并将它们分派到计算节点(CN),直到达到 FE 参数
lake_compaction_max_tasks
设置的限制。 - 子任务执行:CN 在后台执行 compaction 子任务。每个 CN 的并发子任务数由 CN 参数
compact_threads
控制。 - 结果收集:FE 聚合子任务结果并提交 compaction 事务。
- 发布:FE 发布成功提交的 compaction 事务。
管理 compaction
查看 compaction 分数
-
您可以使用 SHOW PROC 语句查看特定表中分区的 compaction 分数。
SHOW PROC '/dbs/<database_name>/<table_name>/partitions'
示例
mysql> SHOW PROC '/dbs/load_benchmark/store_sales/partitions';
+-------------+---------------+----------------+----------------+-------------+--------+--------------+-------+------------------------------+---------+----------+-----------+----------+------------+-------+-------+-------+
| PartitionId | PartitionName | CompactVersion | VisibleVersion | NextVersion | State | PartitionKey | Range | DistributionKey | Buckets | DataSize | RowCount | CacheTTL | AsyncWrite | AvgCS | P50CS | MaxCS |
+-------------+---------------+----------------+----------------+-------------+--------+--------------+-------+------------------------------+---------+----------+-----------+----------+------------+-------+-------+-------+
| 38028 | store_sales | 913 | 921 | 923 | NORMAL | | | ss_item_sk, ss_ticket_number | 64 | 15.6GB | 273857126 | 2592000 | false | 10.00 | 10.00 | 10.00 |
+-------------+---------------+----------------+----------------+-------------+--------+--------------+-------+------------------------------+---------+----------+-----------+----------+------------+-------+-------+-------+
1 row in set (0.20 sec) -
您还可以通过查询系统定义的视图
information_schema.partitions_meta
来查看分区 compaction 分数。示例
mysql> SELECT * FROM information_schema.partitions_meta ORDER BY Max_CS LIMIT 10;
+--------------+----------------------------+----------------------------+--------------+-----------------+-----------------+----------------------+--------------+---------------+-----------------+-----------------------------------------+---------+-----------------+----------------+---------------------+-----------------------------+--------------+---------+-----------+------------+------------------+----------+--------+--------+-------------------------------------------------------------------+
| DB_NAME | TABLE_NAME | PARTITION_NAME | PARTITION_ID | COMPACT_VERSION | VISIBLE_VERSION | VISIBLE_VERSION_TIME | NEXT_VERSION | PARTITION_KEY | PARTITION_VALUE | DISTRIBUTION_KEY | BUCKETS | REPLICATION_NUM | STORAGE_MEDIUM | COOLDOWN_TIME | LAST_CONSISTENCY_CHECK_TIME | IS_IN_MEMORY | IS_TEMP | DATA_SIZE | ROW_COUNT | ENABLE_DATACACHE | AVG_CS | P50_CS | MAX_CS | STORAGE_PATH |
+--------------+----------------------------+----------------------------+--------------+-----------------+-----------------+----------------------+--------------+---------------+-----------------+-----------------------------------------+---------+-----------------+----------------+---------------------+-----------------------------+--------------+---------+-----------+------------+------------------+----------+--------+--------+-------------------------------------------------------------------+
| tpcds_1t | call_center | call_center | 11905 | 0 | 2 | 2024-03-17 08:30:47 | 3 | | | cc_call_center_sk | 1 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 12.3KB | 42 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/11906/11905 |
| tpcds_1t | web_returns | web_returns | 12030 | 3 | 3 | 2024-03-17 08:40:48 | 4 | | | wr_item_sk, wr_order_number | 16 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 3.5GB | 71997522 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/12031/12030 |
| tpcds_1t | warehouse | warehouse | 11847 | 0 | 2 | 2024-03-17 08:30:47 | 3 | | | w_warehouse_sk | 1 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 4.2KB | 20 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/11848/11847 |
| tpcds_1t | ship_mode | ship_mode | 11851 | 0 | 2 | 2024-03-17 08:30:47 | 3 | | | sm_ship_mode_sk | 1 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 1.7KB | 20 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/11852/11851 |
| tpcds_1t | customer_address | customer_address | 11790 | 0 | 2 | 2024-03-17 08:32:19 | 3 | | | ca_address_sk | 16 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 120.9MB | 6000000 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/11791/11790 |
| tpcds_1t | time_dim | time_dim | 11855 | 0 | 2 | 2024-03-17 08:30:48 | 3 | | | t_time_sk | 16 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 864.7KB | 86400 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/11856/11855 |
| tpcds_1t | web_sales | web_sales | 12049 | 3 | 3 | 2024-03-17 10:14:20 | 4 | | | ws_item_sk, ws_order_number | 128 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 47.7GB | 720000376 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/12050/12049 |
| tpcds_1t | store | store | 11901 | 0 | 2 | 2024-03-17 08:30:47 | 3 | | | s_store_sk | 1 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 95.6KB | 1002 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/11902/11901 |
| tpcds_1t | web_site | web_site | 11928 | 0 | 2 | 2024-03-17 08:30:47 | 3 | | | web_site_sk | 1 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 13.4KB | 54 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/11929/11928 |
| tpcds_1t | household_demographics | household_demographics | 11932 | 0 | 2 | 2024-03-17 08:30:47 | 3 | | | hd_demo_sk | 1 | 1 | HDD | 9999-12-31 23:59:59 | NULL | 0 | 0 | 2.1KB | 7200 | 0 | 0 | 0 | 0 | s3://XXX/536a3c77-52c3-485a-8217-781734a970b1/db10328/11933/11932 |
+--------------+----------------------------+----------------------------+--------------+-----------------+-----------------+----------------------+--------------+---------------+-----------------+-----------------------------------------+---------+-----------------+----------------+---------------------+-----------------------------+--------------+---------+-----------+------------+------------------+----------+--------+--------+-------------------------------------------------------------------+
您只需要关注以下两个指标
AvgCS
: 分区中所有 Tablet 的平均 compaction 分数。MaxCS
: 分区中所有 Tablet 的最大 compaction 分数。
查看 compaction 任务
随着新数据加载到系统中,FE 不断调度 compaction 任务以在不同的 CN 节点上执行。您可以首先查看 FE 上 compaction 任务的总体状态,然后查看 CN 上每个任务的执行详细信息。
查看 compaction 任务的总体状态
您可以使用 SHOW PROC 语句查看 compaction 任务的总体状态。
SHOW PROC '/compactions';
示例
mysql> SHOW PROC '/compactions';
+---------------------+-------+---------------------+---------------------+---------------------+-------+--------------------------------------------------------------------------------------------------------------------+
| Partition | TxnID | StartTime | CommitTime | FinishTime | Error | Profile |
+---------------------+-------+---------------------+---------------------+---------------------+-------+--------------------------------------------------------------------------------------------------------------------+
| ssb.lineorder.43026 | 51053 | 2024-09-24 19:15:16 | NULL | NULL | NULL | NULL |
| ssb.lineorder.43027 | 51052 | 2024-09-24 19:15:16 | NULL | NULL | NULL | NULL |
| ssb.lineorder.43025 | 51047 | 2024-09-24 19:15:15 | NULL | NULL | NULL | NULL |
| ssb.lineorder.43026 | 51046 | 2024-09-24 19:15:04 | 2024-09-24 19:15:06 | 2024-09-24 19:15:06 | NULL | {"sub_task_count":1,"read_local_sec":0,"read_local_mb":31,"read_remote_sec":0,"read_remote_mb":0,"in_queue_sec":0} |
| ssb.lineorder.43027 | 51045 | 2024-09-24 19:15:04 | 2024-09-24 19:15:06 | 2024-09-24 19:15:06 | NULL | {"sub_task_count":1,"read_local_sec":0,"read_local_mb":31,"read_remote_sec":0,"read_remote_mb":0,"in_queue_sec":0} |
| ssb.lineorder.43029 | 51044 | 2024-09-24 19:15:03 | 2024-09-24 19:15:05 | 2024-09-24 19:15:05 | NULL | {"sub_task_count":1,"read_local_sec":0,"read_local_mb":31,"read_remote_sec":0,"read_remote_mb":0,"in_queue_sec":0} |
+---------------------+-------+---------------------+---------------------+---------------------+-------+--------------------------------------------------------------------------------------------------------------------+
返回以下字段
Partition
:compaction 任务所属的分区。TxnID
:分配给 compaction 任务的事务 ID。StartTime
:compaction 任务的开始时间。NULL
表示该任务尚未启动。CommitTime
:compaction 任务提交数据的时间。NULL
表示数据尚未提交。FinishTime
:compaction 任务发布数据的时间。NULL
表示数据尚未发布。Error
:compaction 任务的错误消息(如果有)。Profile
:(从 v3.2.12 和 v3.3.4 开始支持)compaction 任务完成后的 Profile。sub_task_count
:分区中的子任务数(相当于 Tablet)。read_local_sec
:所有子任务从本地缓存读取数据的总时间消耗。单位:秒。read_local_mb
:所有子任务从本地缓存读取的数据总大小。单位:MB。read_remote_sec
:所有子任务从远程存储读取数据的总时间消耗。单位:秒。read_remote_mb
所有子任务从远程存储读取的数据总大小。单位:MB。in_queue_sec
:所有子任务在队列中停留的总时间。单位:秒。
查看 compaction 任务的执行详细信息
每个 compaction 任务都分为多个子任务,每个子任务对应于一个 Tablet。您可以通过查询系统定义的视图 information_schema.be_cloud_native_compactions
来查看每个子任务的执行详细信息。
示例
mysql> SELECT * FROM information_schema.be_cloud_native_compactions;
+-------+--------+-----------+---------+---------+------+---------------------+-------------+----------+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| BE_ID | TXN_ID | TABLET_ID | VERSION | SKIPPED | RUNS | START_TIME | FINISH_TIME | PROGRESS | STATUS | PROFILE |
+-------+--------+-----------+---------+---------+------+---------------------+-------------+----------+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 10001 | 51047 | 43034 | 12 | 0 | 1 | 2024-09-24 19:15:15 | NULL | 82 | | {"read_local_sec":0,"read_local_mb":31,"read_remote_sec":0,"read_remote_mb":0,"read_remote_count":0,"read_local_count":1900,"segment_init_sec":0,"column_iterator_init_sec":0,"in_queue_sec":0} |
| 10001 | 51048 | 43032 | 12 | 0 | 1 | 2024-09-24 19:15:15 | NULL | 82 | | {"read_local_sec":0,"read_local_mb":32,"read_remote_sec":0,"read_remote_mb":0,"read_remote_count":0,"read_local_count":1900,"segment_init_sec":0,"column_iterator_init_sec":0,"in_queue_sec":0} |
| 10001 | 51049 | 43033 | 12 | 0 | 1 | 2024-09-24 19:15:15 | NULL | 82 | | {"read_local_sec":0,"read_local_mb":31,"read_remote_sec":0,"read_remote_mb":0,"read_remote_count":0,"read_local_count":1900,"segment_init_sec":0,"column_iterator_init_sec":0,"in_queue_sec":0} |
| 10001 | 51051 | 43038 | 9 | 0 | 1 | 2024-09-24 19:15:15 | NULL | 84 | | {"read_local_sec":0,"read_local_mb":31,"read_remote_sec":0,"read_remote_mb":0,"read_remote_count":0,"read_local_count":1900,"segment_init_sec":0,"column_iterator_init_sec":0,"in_queue_sec":0} |
| 10001 | 51052 | 43036 | 12 | 0 | 0 | NULL | NULL | 0 | | |
| 10001 | 51053 | 43035 | 12 | 0 | 1 | 2024-09-24 19:15:16 | NULL | 2 | | {"read_local_sec":0,"read_local_mb":1,"read_remote_sec":0,"read_remote_mb":0,"read_remote_count":0,"read_local_count":100,"segment_init_sec":0,"column_iterator_init_sec":0,"in_queue_sec":0} |
+-------+--------+-----------+---------+---------+------+---------------------+-------------+----------+--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
返回以下字段
BE_ID
:CN 的 ID。TXN_ID
:子任务所属事务的 ID。TABLET_ID
:子任务所属 Tablet 的 ID。VERSION
:Tablet 的版本。RUNS
:子任务已执行的次数。START_TIME
:子任务的开始时间。FINISH_TIME
:子任务的完成时间。PROGRESS
:Tablet 的 compaction 进度(百分比)。STATUS
:子任务的状态。如果出现错误,则会在此字段中返回错误消息。PROFILE
:(从 v3.2.12 和 v3.3.4 开始支持)子任务的运行时 Profile。read_local_sec
:子任务从本地缓存读取数据的时间消耗。单位:秒。read_local_mb
:子任务从本地缓存读取的数据大小。单位:MB。read_remote_sec
:子任务从远程存储读取数据的时间消耗。单位:秒。read_remote_mb
子任务从远程存储读取的数据大小。单位:MB。read_local_count
:子任务从本地缓存读取数据的次数。read_remote_count
:子任务从远程存储读取数据的次数。in_queue_sec
:子任务在队列中停留的时间。单位:秒。
配置 compaction 任务
您可以使用这些 FE 和 CN (BE) 参数来配置 compaction 任务。
FE 参数
您可以动态配置以下 FE 参数。
ADMIN SET FRONTEND CONFIG ("lake_compaction_max_tasks" = "-1");
lake_compaction_max_tasks
- 默认值:-1
- 类型:Int
- 单位:-
- 是否可变:是
- 说明:shared-data 集群中允许的最大并发 Compaction 任务数。将此项设置为
-1
表示以自适应方式计算并发任务数,即存活 CN 节点数乘以 16。将此值设置为0
将禁用 compaction。 - 引入于:v3.1.0
ADMIN SET FRONTEND CONFIG ("lake_compaction_disable_tables" = "11111;22222");
lake_compaction_disable_tables
- 默认值:""
- 类型:String
- 单位:-
- 是否可变:是
- 说明:禁用某些表的 compaction。这不会影响已经启动的 compaction。此项的值是表 ID。多个值用 ';' 分隔。
- 引入版本:v3.2.7
CN 参数
您可以动态配置以下 CN 参数。
UPDATE information_schema.be_configs SET VALUE = 8
WHERE name = "compact_threads";
compact_threads
- 默认值:4
- 类型:Int
- 单位:-
- 是否可变:是
- 说明:用于并发 compaction 任务的最大线程数。从 v3.1.7 和 v3.2.2 开始,此配置更改为动态。
- 引入于:v3.0.0
注意
在生产环境中,建议将
compact_threads
设置为 BE/CN CPU 核心数的 25%。
max_cumulative_compaction_num_singleton_deltas
- 默认值:500
- 类型:Int
- 单位:-
- 是否可变:是
- 说明:单个 Cumulative Compaction 中可以合并的最大段数。如果在 compaction 期间发生 OOM,您可以降低此值。
- 引入版本:-
注意
在生产环境中,建议将
max_cumulative_compaction_num_singleton_deltas
设置为100
,以加速 compaction 任务并减少其资源消耗。
lake_pk_compaction_max_input_rowsets
- 默认值:500
- 类型:Int
- 单位:-
- 是否可变:是
- 说明:shared-data 集群中主键表 compaction 任务中允许的最大输入 Rowset 数。从 v3.2.4 和 v3.1.10 开始,此参数的默认值从
5
更改为1000
,从 v3.3.1 和 v3.2.9 开始更改为500
。在为主键表启用 Sized-tiered Compaction 策略后(通过将enable_pk_size_tiered_compaction_strategy
设置为true
),StarRocks 不需要限制每个 compaction 的 Rowset 数量,以减少写入放大。因此,此参数的默认值会增加。 - 引入版本:v3.1.8, v3.2.3
手动触发 compaction 任务
-- Trigger compaction for the whole table.
ALTER TABLE <table_name> COMPACT;
-- Trigger compaction for a specific partition.
ALTER TABLE <table_name> COMPACT <partition_name>;
-- Trigger compaction for multiple partitions.
ALTER TABLE <table_name> COMPACT (<partition_name>, <partition_name>, ...);
取消 compaction 任务
您可以使用任务的事务 ID 手动取消 compaction 任务。
CANCEL COMPACTION WHERE TXN_ID = <TXN_ID>;
注意
- CANCEL COMPACTION 语句必须从 Leader FE 节点提交。
- CANCEL COMPACTION 语句仅适用于尚未提交的事务,即
SHOW PROC '/compactions'
的返回结果中CommitTime
为 NULL。- CANCEL COMPACTION 是一个异步过程。您可以通过执行
SHOW PROC '/compactions'
来检查任务是否已取消。
最佳实践
由于 Compaction 对查询性能至关重要,因此建议定期监控表和数据的合并状态。以下是一些最佳实践和指南
- 尽量增加加载之间的时间间隔(避免间隔小于 10 秒的情况),并增加每次加载的批处理大小(避免批处理大小小于 100 行数据)。
- 调整 CN 上并行 compaction 工作线程的数量以加速任务执行。建议在生产环境中将
compact_threads
设置为 BE/CN CPU 核心数的 25%。当集群空闲时(例如,仅执行 compaction 而不处理查询),您可以暂时将此值增加到 50%,并在任务完成后恢复为 25%。 - 使用
show proc '/compactions'
和select * from information_schema.be_cloud_native_compactions;
监控 Compaction 任务状态。 - 监控 Compaction Score,并根据它配置警报。StarRocks 的内置 Grafana 监控模板包含此指标。
- 注意 compaction 期间的资源消耗,尤其是内存使用情况。Grafana 监控模板还包含此指标。