Doris 大量小文件优化
关键配置参数
- tablet_max_versions:单个Tablet保留的最大Version数(默认1000)
- storage_flood_stage_usage_percent:磁盘警戒线触发紧急GC
参数名 | 默认值 | 说明 |
---|---|---|
tablet_max_versions | 1000 | Tablet保留的最大Version数 |
max_compaction_concurrency | 10 | 最大并发Compaction任务数 |
cumulative_compaction_min_deltas | 3 | 触发Cumulative Compaction的最小Version数 |
base_compaction_interval_secs | 86400 | Base Compaction触发间隔(秒) |
min_compaction_failure_interval_sec | 600 | Compaction失败重试间隔 |
cumulative_compaction_max_deltas | 10 单次Cumulative合并的最大版本数 | |
base_compaction_interval_seconds_since_last_operation | 86400 | Base Compaction触发间隔 |
compaction_task_num_threads_per_disk | 2 | 每个磁盘的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;
- 查看和触发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