一. 离线Compaction 概述
MOR 表的 compaction 默认是自动打开的, 策略是 5 个 commits 执行一次压缩。 因为压缩操作比较耗费 内存,和写流程放在同一个 pipeline, 在数据量比较的时候 (10W+/s qps),容易干扰写流程,此时采用离线定时任务的方式执行 compaction 任务更稳定。
1.1 设置参数
-
compaction.async.enabled
为 false,关闭在线 compaction。 -
compaction.scheduler.enabled
仍然保持开启,由写任务阶段性出发压缩 plan Compaction过程。
1.2 原理
一个 compaction 的 任务的执行包括两部分:
- schedule 压缩 plan
该过程推荐由写任务定时出发,写参数compaction.scheduler.enabled
默认开启 - 执行对应的压缩plan
1.3 使用方式
执行命令:
离线 compaction 需要手动执行 Java 程序, 程序入口:
hudi-flink1.14-bundle-0.12.jar
org.apache.hudi.sink.compact.HoodieFlinkCompactor
// 命令行方式
./bin/flink run -c org.apache.hudi.sink.compact.HoodieFlinkCompactor lib/hudi-flink1.14-bundle-0.12.0.jar --path hdfs://xxx:8020/table
参数名 | required | 默认值值 | 备注 |
---|---|---|---|
--path | true | -- | 目标表的路径 |
--compaction-tasks | false | -1 | 压缩 task 的并发,默认是待压缩 file group 的 数量 |
--compaction-max-memory | false | 100 (单位 MB) | 压缩时 log 数据的索引 map,默认 100MB,内存足够可以开大些 |
--scheduler | false | false | 是否要执行 schedule compaction 的操作 |
--seq | false | LIFO | 执行压缩任务的顺序,默认是从最新的压缩plan 开始执行,可选值: LIFO:从最新的plan开始执行; FIFO: 从最老的plan开始执行 |
--service | false | false | 是否开启 service 模式,service模式会打开常驻进程,一直监听压缩并提交到 集群执行(从0.11 开始执行) |
--min-compaction-interval-seconds | false | 600 (单位 秒) | service 模式下的执行间隔,默认10分钟 |