Skip to content

Doris 大量小文件优化

关键配置参数

  • tablet_max_versions:单个Tablet保留的最大Version数(默认1000)
  • storage_flood_stage_usage_percent:磁盘警戒线触发紧急GC
参数名默认值说明
tablet_max_versions1000Tablet保留的最大Version数
max_compaction_concurrency10最大并发Compaction任务数
cumulative_compaction_min_deltas3触发Cumulative Compaction的最小Version数
base_compaction_interval_secs86400Base Compaction触发间隔(秒)
min_compaction_failure_interval_sec600Compaction失败重试间隔
cumulative_compaction_max_deltas10 单次Cumulative合并的最大版本数
base_compaction_interval_seconds_since_last_operation86400Base Compaction触发间隔
compaction_task_num_threads_per_disk2每个磁盘的compaction线程数
compaction_work_dir${DORIS_HOME}/compaction临时工作目录

手动触发Compaction

手动触发Version合并

sql
-- 表级别
ADMIN COMPACT TABLE db_name.tbl_name;

-- 分区级别
ADMIN COMPACT TABLE db_name.tbl_name PARTITION(p1,p2);

-- 尝试修复
ADMIN REPAIR TABLE db_name.tbl_name;
  1. 查看和触发Compaction的方式

查看Compaction

代码语言:

shell
curl -X GET http://172.18.0.143:8030/api/compaction/run_status
curl -X GET http://172.18.0.143:8030/api/compaction/show?tablet_id={int}

# 获取表信息
http://172.18.0.143:8040/api/meta/header/149701

② 触发Compaction

shell
# 取值为base或cumulative或full,只有table才能指定full
curl -X POST http://172.18.0.143:8030/api/compaction/run?tablet_id={int}&compact_type=full
curl -X POST http://172.18.0.143:8030/api/compaction/run?table_id={int}&compact_type=full

注意,tablet_id 和 table_id 只能指定一个,不能够同时指定,指定 table_id 后会自动对此 table 下所有 tablet 执行 full_compaction。

查看合并任务

sql
-- 监控Compaction状态:
SHOW PROC '/compaction';
SHOW PROC '/compaction/running';
SHOW PROC '/compaction/queue';

-- 查看Compaction历史:

SHOW PROC '/compaction/history';

其他配置

针对MoW的优化配置

  • enable_vertical_compaction=true
  • vertical_compaction_num_columns_per_group=5

Compaction 调优策略

目前我们刚开始使用Doris,对Compaction的了解还不够深入,同时社区雨神建议没有遇到问题新版本不建议进行调整,遇到实际情况再具体分析。如果有遇到某些tablet有很多版本没有合并,集群的Compaction策略没有覆盖到,可以参考上面进行手动触发Compaction。

不过我也整理了一下关于be.conf的参数,提供参考:

磁盘相关

  • compaction_task_num_per_disk:每个磁盘(HDD)可以并发执行的compaction任务数量,默认4
  • compaction_task_num_per_fast_disk 每个高速磁盘(SSD)可以并发执行的compaction任务数量,默认8

compaction_threads 相关的bc cc参数

  • max_base_compaction_threads Base Compaction 线程池中线程数量的最大值。默认为 4
  • max_cumu_compaction_threads Cumulative Compaction 线程池中线程数量的最大值。默认为 10
  • max_single_replica_compaction_threads Single Replica Compaction 线程池中线程数量的最大值。默认为 10

其他

  • max_tablet_version_num tablet版本号,写入频率高的话可以调大
  • max_segment_num_per_rowset 用于限制导入时,新产生的rowset中的segment数量

关于Compaction额外的建议

其实很多Compaction不合理除了突发的高频、巨量的写入会带来突然的Compaction异常,其实也有很多是来自于生产操作不规范带来的:

  • 生产建表不规范案例
  • 创建的bucket数量不合理,建议建表前进行评估,一个tablet大概1-10G原则
  • 建表时使用了自动分区,导致tablet小文件过多
  • 建表时启用了动态分区、创建历史分区,导致创建出一堆无用的历史分区,这些分区创建非常多的tablet小文件,也会引发集群后续的问题
  • 生产删除数据规范

  • Unique模型

    • 【建议】建分区表,由dba drop分区老化数据
    • 【万不得已】提供删除脚本,由dba定时删除
  • Duplicate/Aggregate模型

    • 【建议】提供删除脚本,由dba定时批量update删除数据隐藏字段DORIS_DELETE_SIGN的值为1,doris底层帮忙批量删除(如果想看隐藏字段或者delete完还未真正清除的数据,可以通过设置SET show_hidden_columns=true;查看)
    • 【万不得已】cdc的方式,替换delete操作,用update删除数据隐藏字段DORIS_DELETE_SIGN的值为1,doris底层帮忙批量删除

基本配置

yaml
# 最大连接数
qe_max_connection = 4096
max_conn_per_user = 1024
# 执行查询最大时间
qe_query_timeout_second = 300
# 开启导出到本地
enable_outfile_to_local = true