Tag创建与管理

创建标签(Tag)策略可以保留关键快照。创建Tag的快照,在进入过期清除流程时,快照的元数据与数据文件仍会被持续保存。在快照过期后,借助标签仍能追溯查询到特定时间点的数据。在实践中,每日生成一个标签尤为实用,能够确保对每一天历史数据的持久访问能力,为数据分析、审计追溯等应用场景提供了坚实支撑。本文为您介绍如何自动和手动创建与删除Tag、回退到指定Tag、查询Tag数据及高级配置。

使用限制

仅实时计算引擎VVR 8.0.5及以上版本支持Paimon表。

自动创建与删除Tag

Paimon支持在写入数据的过程中,按照表参数的配置自动创建Tag以及删除过期的Tag。您需要配置相关表参数。

参数

说明

备注

tag.automatic-creation

Tag创建模式,即基于何种行为触发自动创建。

参数取值如下:

  • process-time:基于机器的系统时间间隔触发Tag的创建。

  • Watermark:基于上游的Watermark间隔触发Tag的创建。

    您可以通过sink.watermark-time-zone参数指定Watermark的时区。

  • batch:在每次批作业完成后触发tag创建。

说明

如果未配置该参数,则不会自动创建Tag。

tag.creation-period

指定Tag创建时间间隔。

如果您指定的Tag创建模式为process-time或者watermark,那么同时您需要指定自动创建Tag的时间间隔。支持的时间间隔如下:

  • daily(默认值):创建Tag的间隔为一天。触发时间为00:00。

  • hourly:创建Tag的间隔为一小时。触发时间为整点。

  • two-hours:创建Tag的间隔为两小时。触发时间为整点。

tag.creation-delay

指定延迟时间。

默认延迟时间为0。如果您的作业存在延迟,并且您希望触发自动创建时,能够等待延迟的数据提交后再创建,可以指定延迟时间。例如,如果您的作业延迟为10分钟,则可以设置'tag.creation-delay' = '10 m'。在到达需要创建Tag的时间点时,还会再等待10分钟才创建Tag,保证延迟的数据被记录到这次创建的Tag中。

tag.num-retained-max

指定最多保留的Tag数量。

由于Tag会保留某个快照的元数据和数据文件,因此旧的Tag可能导致不需要使用的历史数据文件占用存储。当创建的Tag数量超出这个参数时,最早的Tag将会被删除,相应的数据也会被清理。

例如,创建的Paimon表,Tag在每天00:10(00:00触发创建,加上延迟时间10分钟)自动创建,并且保留3个月的Tag(设置的最大保留数为90,3个月产生90个)。

CREATE TABLE mycat.mydb.mytbl (
  k INT,
  v INT,
  PRIMARY KEY (k) NOT ENFORCED
) WITH (
  'tag.automatic-creation' = 'process-time',
  'tag.creation-period' = 'daily',
  'tag.creation-delay' = '10 m',
  'tag.num-retained-max' = '90'
);

手动创建和删除Tag

您可以在查询脚本中执行CALL语句手动创建或删除Tag。

操作

命令

手动创建Tag

-- 在mycat.mydb.mytbl表中,基于编号为1的快照创建名为tag-1Tag。
CALL `mycat`.sys.create_tag('mydb.mytbl', 'tag-1', 1);

-- 基于最新的快照创建名为tag-2Tag。
CALL `mycat`.sys.create_tag('mydb.mytbl', 'tag-2');

手动删除Tag

-- 在mycat.mydb.mytbl表中,删除名为tag-1Tag。
CALL `mycat`.sys.delete_tag('mydb.mytbl', 'tag-1');

回退到指定Tag

如果您的作业出现了错误,并且有较早时候创建的Tag,您可以回退到Tag,从而使数据回到正确的状态。

重要

这个操作会将Tag的时间之后的数据删除,请谨慎使用,并在操作前备份数据文件。

-- 使mycat.mydb.mytbl表回退到tag-1的状态。
CALL `mycat`.sys.rollback_to('mydb.mytbl', 'tag-1');

查询Tag元数据和数据

  • 查询Tag元数据

    您可以通过查询Tags系统表查询所有Tag的元数据信息,更多Tags系统表的信息,请参见Tags系统表。以mycat.mydb.mytbl为例:

    SELECT * FROM mycat.mydb.`mytbl$tags`;
  • 查询Tag数据

    Tag可以用于批读。您可以通过SQL Hints读取特定Tag指向的数据,或者读取两个Tag间的增量数据。

    • 读取指定Tag的数据

      -- 指定读取名为 tag-1 的 tag
      SELECT * FROM mycat.mydb.mytbl /*+ OPTIONS('scan.tag-name' = 'tag-1') */;
    • 读取两个Tag间的增量数据

      -- 指定读取tag-1tag-2间的增量数据。
      SELECT * FROM mycat.mydb.mytbl /*+ OPTIONS('incremental-between' = 'tag-1,tag-2') */;

高级配置

设置自动创建的Tag名称格式

您可以通过表参数tag.period-formatter来设置。支持的参数值如下:

  • with_dashes(默认值):Tag名称中的日期带有短划线(-),即yyyy-MM-dd HH。

  • without_dashes:Tag名称中的日期不带短划线(-),即yyyyMMdd HH。

与快照(Savepoint)结合使用

在使用Flink时,通常会利用保存点机制来长期保存作业状态,并用于作业的增量恢复。但是Paimon的快照会自动过期清理,在作业长时间运行后,保存点对应的快照文件可能会因为过期而被清理,导致从保存点对应的快照恢复作业失败。

PaimonTag能长期保留某个快照的状态,因此,您可以结合这两个功能,在触发保存点的同时创建相应的Tag,方便在未来从某个保存点恢复作业。

要使用这个特性,首先您需要通过ALTER TABLE语句SQL Hints配置表参数sink.savepoint.auto-tag = true来开启Tag自动创建。当您需要从保存点恢复作业时,操作步骤如下。

  1. 找到该保存点对应的Tag。

    自动创建的Tag名称的格式为savepoint-${savepointID}

  2. 停止作业后,执行如下命令将数据回退到指定Tag。

    CALL `<catalog-name>`.sys.rollback_to('<database-name>.<table-name>', 'savepoint-${savepointID}')
  3. 从保存点对应的快照恢复作业。

响应源表的Idle状态

自动创建Tag功能依赖于Paimon的数据提交机制。当Paimon提交数据时,会创建快照,同时也会检查当前时间点是否满足创建Tag的条件。在一般情况下,当源表长时间处于Idle状态,未发送数据时,Paimon会提交空数据,此时不会创建快照。如果在这个时间点正好需要创建Tag,就会导致相应的Tag没有按时创建。

如果您配置了表参数'tag.automatic-creation' = 'process-time',这个问题不会产生。因为Paimon会在这种情况下强制创建快照,从而正常触发Tag的创建。

但是,如果您配置了表参数'tag.automatic-creation' = 'watermark',此时Paimon无法判断上游是否长时间未发送数据。您需要额外配置表参数snapshot.watermark-idle-timeout来指定源表的最长Idle时间。如果源表在超过指定时间后仍未发送数据,则会强制创建快照,从而正常触发Tag的创建。

相关文档

调整快照文件过期时间、设置分区的过期时间、以及清理废弃文件,详情请参见清理过期数据