异步的 clustering 相对于 online 的 async clustering 资源隔离,从而更加稳定。
设置参数
clustering.async.enabled 为 false,关闭在线 clustering。
clustering.schedule.enabled 仍然保持开启,由写任务阶段性触发 clustering plan。
原理
一个 clustering 的任务的执行包括两部分:
schedule plan
推荐由写任务定时触发,写参数 clustering.schedule.enabled 默认开启。
执行对应的 plan
使用方式
1)执行命令
离线 clustering 需要手动执行 Java 程序,程序入口:
hudi-flink1.13-bundle-0.12.0.jar
org.apache.hudi.sink.clustering.HoodieFlinkClusteringJob
注意:必须是分区表,否则报错空指针异常。
// 命令行的方式
./bin/flink run -c org.apache.hudi.sink.clustering.HoodieFlinkClusteringJob lib/hudi-flink1.13-bundle-0.12.0.jar --path hdfs://xxx:8020/table
2)参数配置
参数名 | required | 默认值 | 备注 |
---|---|---|---|
path | true | 目标表的路径 | |
clustering-tasks | false | -1 | Clustering task 的并发,默认是待压缩 file group 的数量 |
schedule | false | false | 是否要执行 schedule clustering plan 的操作,当写流程还在持续写入表数据的时候,开启这个参数有丢失查询数据的风险,所以开启该参数一定要保证当前没有任务往表里写数据, 写任务的 clustering plan 默认是一直 schedule 的,除非手动关闭(默认 4 个 commits 一次 clustering) |
seq | false | FIFO | 执行压缩任务的顺序,默认是从最老的 clustering plan 开始执行,可选值:LIFO: 从最新的 plan 开始执行;FIFO: 从最老的 plan 开始执行 |
target-file-max-bytes | false | 1024 * 1024 * 1024 | 最大目标文件,默认 1GB |
small-file-limit | false | 600 | 小于该大小的文件会参与 clustering,默认 600MB |
sort-columns | false | N/A | Clustering 可选排序列 |
service | false | false | 是否开启 service 模式,service 模式会打开常驻进程,一直监听压缩任务并提交到集群执行(从 0.11 开始执行) |
min-compaction-interval-seconds | false | 600 (单位 秒) | service 模式下的执行间隔,默认 10 分钟 |
3)案例演示
(1)创建表,关闭在线压缩
create table t8(
id int,
age int,
ts int,
primary key (id) not enforced
) partitioned by (age)
with (
'connector' = 'hudi',
'path' = '/tmp/hudi_catalog/default/t8',
'clustering.async.enabled' = 'false',
'clustering.schedule.enabled' = 'true',
'table.type' = 'COPY_ON_WRITE'
);
insert into t8 values(1,18,1);
insert into t8 values(2,18,2);
insert into t8 values(3,18,3);
insert into t8 values(4,18,4);
insert into t8 values(5,18,5);
// 命令行的方式
./bin/flink run -c org.apache.hudi.sink.clustering.HoodieFlinkClusteringJob lib/hudi-flink1.13-bundle-0.12.0.jar --path hdfs://hadoop1:8020/tmp/hudi_catalog/default/t8