目录

0. 相关文章链接

1. 离线 Compaction

1.1. 设置参数

1.2. 原理

1.3. 使用方式

1.3.1. 执行命令

1.3.2. 参数配置

1.3.3. 案例演示

2. 离线 Clustering

2.1. 设置参数

2.2. 原理

2.3. 使用方式

2.3.1. 执行命令

2.3.2. 参数配置

2.3.3. 案例演示


0. 相关文章链接

 Hudi文章汇总 

1. 离线 Compaction

        MOR 表的 compaction 默认是自动打开的,策略是 5 个 commits 执行一次压缩。 因为压缩操作比较耗费内存,和写流程放在同一个 pipeline,在数据量比较大的时候(10w+/s qps),容易干扰写流程,此时采用离线定时任务的方式执行 compaction 任务更稳定。

1.1. 设置参数

  • compaction.async.enabled 为 false,关闭在线 compaction。
  • compaction.schedule.enabled 仍然保持开启,由写任务阶段性触发压缩 plan和Compaction过程。

1.2. 原理

一个 compaction 的任务的执行包括两部分:

  • schedule 压缩 plan ,该过程推荐由写任务定时触发,写参数 compaction.schedule.enabled 默认开启。
  • 执行对应的压缩 plan。

1.3. 使用方式

1.3.1. 执行命令

离线 compaction 需要手动执行 Java 程序,程序入口:

  • hudi-flink1.13-bundle-0.12.0.jar
  • org.apache.hudi.sink.compact.HoodieFlinkCompactor
# 命令行的方式
./bin/flink run -c org.apache.hudi.sink.compact.HoodieFlinkCompactor lib/hudi-flink1.13-bundle-0.12.0.jar --path hdfs://xxx:8020/table

1.3.2. 参数配置

参数名

required

默认值

备注

--path

true

--

目标表的路径

--compaction-tasks

false

-1

压缩 task 的并发,默认是待压缩 file group 的数量

--compaction-max-memory

false

100 (单位 MB)

压缩时 log 数据的索引 map,默认 100MB,内存足够可以开大些

--schedule

false

false

是否要执行 schedule compaction 的操作,当写流程还在持续写入表数据的时候,开启这个参数有丢失查询数据的风险,所以开启该参数一定要保证当前没有任务往表里写数据, 写任务的 compaction plan 默认是一直 schedule 的,除非手动关闭(默认 5 个 commits 一次压缩)

--seq

false

LIFO

执行压缩任务的顺序,默认是从最新的压缩 plan 开始执行,可选值:

LIFO: 从最新的 plan 开始执行;

FIFO: 从最老的 plan 开始执行

--service

false

false

是否开启 service 模式,service 模式会打开常驻进程,一直监听压缩任务并提交到集群执行(从 0.11 开始执行)

--min-compaction-interval-seconds

false

600 (单位 秒)

service 模式下的执行间隔,默认 10 分钟

1.3.3. 案例演示

步骤一:创建表,关闭在线压缩

create table t7(
  id int,
  ts int,
  primary key (id) not enforced
)
with (
  'connector' = 'hudi',
  'path' = '/tmp/hudi_catalog/default/t7',
  'compaction.async.enabled' = 'false',
  'compaction.schedule.enabled' = 'true',
  'table.type' = 'MERGE_ON_READ'
);


insert into t7 values(1,1);
insert into t7 values(2,2);
insert into t7 values(3,3);
insert into t7 values(4,4);
insert into t7 values(5,5);

步骤二:定时执行离线压缩

./bin/flink run \
-c org.apache.hudi.sink.compact.HoodieFlinkCompactor \
lib/hudi-flink1.13-bundle-0.12.0.jar \
--path hdfs://hadoop1:8020/tmp/hudi_catalog/default/t7

2. 离线 Clustering

异步的 clustering 相对于 online 的 async clustering 资源隔离,从而更加稳定。

2.1. 设置参数

  • clustering.async.enabled 为 false,关闭在线 clustering。
  • clustering.schedule.enabled 仍然保持开启,由写任务阶段性触发 clustering plan。

2.2. 原理

一个 clustering 的任务的执行包括两部分:

  • schedule plan ,推荐由写任务定时触发,写参数 clustering.schedule.enabled 默认开启。
  • 执行对应的 plan。

2.3. 使用方式

2.3.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.3.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 分钟。

2.3.3. 案例演示

步骤一:创建表,关闭在线压缩

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);

-- 重点1:并须是分区表
-- 重点2: clustering.async.enabled 参数设置为 false
-- 重点3: clustering.schedule.enabled 参数设置为 true

步骤二:定时执行离线命令

./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

注:其他Hudi相关文章链接由此进 ->  Hudi文章汇总