Apache Paimon】-- 6 -- 清理过期数据
目录
1、简要介绍
2、操作方式和步骤
2.1、调整快照文件过期时间
2.2、设置分区过期时间
2.2.1、举例1
2.2.2、举例2
2.3、清理废弃文件
3、参考
1、简要介绍
清理 paimon (表)过期数据可以释放存储空间,优化资源利用并提升系统运行效率等。本文将介绍如何清理 Paimon 表过期的数据,包括:
- (1)调整快照文件过期时间
- (2)设置分区的过期时间
- (3)以及清理废弃文件
2、操作方式和步骤
2.1、调整快照文件过期时间
注意:为了保证快照能准确地还原历史状态,快照文件存在期间,其关联的历史数据文件不可删除。
以下参数决定了快照文件的过期时间。我们可以通过2种方式修改:
(1) ALTER TABLE 语句修改这些参数
(2)在写入作业中通过SQL Hints临时修改这些参数
参数 | 说明 | 数据类型 | 默认值 |
snapshot.num-retained.min | 至少保留几个快照文件。 | Integer | 10 |
snapshot.num-retained.max | 至多保留几个快照文件。 | Integer | 2147483647 |
snapshot.time-retained | 一个快照文件最长保留多久。 | Duration | 1h |
在当前快照文件数量多于 snapshot.num-retained.min
的前提下,只要当前快照文件数量多于 snapshot.num-retained.max
,或最早的快照文件产出时间超过了 snapshot.time-retained
,就会触发快照清理。
下面的示例:
snapshot.num-retained.min
= 2
snapshot.time-retained
=1h
snapshot.num-retained.max
= 5
我使用 tuple (snapshotId, corresponding time) 表示 snapshot item 信息
2.2、设置分区过期时间
如果我们的业务只关心最近一段时间内的数据,那么可以按时间对数据进行分区,并设置分区过期时间以自动删除过于久远的历史分区,从而释放存储空间,高效地利用存储,以降低成本。
非常重要: 只有包含分区过期事件的快照文件也过期了,分区中的数据文件才会被真正删除。
以下参数决定了快照文件的过期时间。我们可以通过2种方式修改:
(1) ALTER TABLE 语句修改这些参数
(2)在写入作业中通过SQL Hints临时修改这些参数
参数 | 说明 | 备注 |
partition.expiration-strategy | 分区过期策略,默认是 values-time | 取值包括: values-time:将分区值提取的时间与当前时间进行比较。 update-time:该策略将分区的最后更新时间与当前时间进行比较。 |
| 分区的过期时间。 | 参数值为时间长度,例如 |
| 将分区值转换为时间字符串的格式串。 | 在该格式串中,分区列由 $ 加上列名表示。 |
| 将时间字符串转换为时间戳的格式串。 |
|
当分区的存活时长超过分区的过期时间参数值时,该分区将被删除。分区的存活时长等于当前系统时间减去分区值转化后的时间戳。分区值转化成时间戳的逻辑如下:
- 通过 partition.timestamp-pattern 参数指定的格式串,将一个分区值转换为时间字符串。
- 通过 partition.timestamp-formatter 参数指定的格式串,将时间字符串转换为时间戳。
2.2.1、举例1
-
假设分区列由
dt
一列组成,可以设置'partition.timestamp-pattern' = '$dt'
将分区dt=20241108
转化为字符串20241108
,设置'partition.timestamp-formatter' = 'yyyyMMdd'
将该字符串转换为时间戳。 -
假设分区列由
year
、month
和day
三列组成,可以设置'partition.timestamp-pattern' = '$year-$month-$day'
,将分区year=2024,month=11,day=21
转化为字符串2024-11-21
。此时不需要设置partition.timestamp-formatter
,因为该字符串符合默认格式之一的yyyy-MM-dd
。 -
假设分区列由
year
、month
、day
和hour
四列组成,可以设置'partition.timestamp-pattern' = '$year-$month-$day $hour:00:00'
,将分区year=2024,month=11,day=21,hour=17
转换为字符串2024-11-21 17:00:00
。此时不需要设置partition.timestamp-formatter
,因为该字符串符合默认格式之一的yyyy-MM-dd HH:mm:ss
。
2.2.2、举例2
-- 默认策略1: value-time
CREATE TABLE t (...) PARTITIONED BY (dt) WITH (
'partition.expiration-time' = '7 d',
'partition.expiration-check-interval' = '1 d',
'partition.timestamp-formatter' = 'yyyyMMdd' -- this is required in `values-time` strategy.
);
-- Let's say now the date is 2024-07-09,so before the date of 2024-07-02 will expire.
insert into t values('pk', '2024-07-01');
-- An example for multiple partition fields
CREATE TABLE t (...) PARTITIONED BY (other_key, dt) WITH (
'partition.expiration-time' = '7 d',
'partition.expiration-check-interval' = '1 d',
'partition.timestamp-formatter' = 'yyyyMMdd',
'partition.timestamp-pattern' = '$dt'
);
-- 策略2: update-time
CREATE TABLE t (...) PARTITIONED BY (dt) WITH (
'partition.expiration-time' = '7 d',
'partition.expiration-check-interval' = '1 d',
'partition.expiration-strategy' = 'update-time'
);
-- The last update time of the partition is now, so it will not expire.
insert into t values('pk', '2024-01-01');
-- Support non-date formatted partition.
insert into t values('pk', 'par-1');
2.3、清理废弃文件
这种方式主要用于处理 Flink job 出现异常时的情况。由于作业报错重启等原因,Paimon表目录下可能会遗留一些未被提交的临时文件。这些文件无法通过快照过期删除,需手动执行以下步骤进行清理。清理的操作步骤如下:
(1)编辑 SQL 命令
CALL `<catalog-name>`.sys.remove_orphan_files('<database-name>.<table-name>');
说明:
<catalog-name> :
Paimon Catalog 的名称
<database-name> :
需要清理的 Paimon 表所在的 Database 的名称
<table-name>:
需要清理的 Paimon 表的名称。
注意:默认情况下,清理废弃文件只清理创建时间超过1天的废弃文件。我们可以额外传入时间参数,指定最晚创建时间。
举例:下面代码示例展示了清理 myproject.mydb.mytbl 表中,创建时间不晚于 2024-10-31 12:00:00 的废弃文件。
CALL `myproject`.sys.remove_orphan_files('mydb.mytbl', '2024-10-31 12:00:00');
(2)执行 SQL 命令
(3)检查快照文件目录
3、参考
Expire Partition | Apache Paimon
Manage Snapshots | Apache Paimon