FlinkSql hint之状态生命周期 state_ttl

本文介绍了FlinkSQL中的状态生命周期管理工具statettl,它允许设置状态数据的生存时间,当达到预设TTL后自动清理,以优化存储和提升系统性能。文章详细展示了如何在流连接和分组聚合操作中应用statettl,并提供了相关示例和注意事项。
摘要由CSDN通过智能技术生成

状态生命周期hint

FlinkSQL 的 state ttl(Time-To-Live,生存时间)是一个用于管理状态数据生命周期的机制。在 Flink 流处理中,状态是一个重要的概念,它允许跨时间窗口或事件时间处理的状态化操作。然而,随着时间的推移,这些状态数据可能会变得不再相关或过时。为了有效地管理这些状态并避免无限期地保留它们,Flink 引入了 state ttl 机制。

state ttl 允许你为状态设置一个生存时间。一旦状态数据的生存时间超过了指定的 TTL 值,Flink 就会自动清理这些状态。这有助于减少不必要的状态数据占用,提高系统的稳定性和性能。

对于有状态计算的流连接分组聚合操作,用户可以通过 STATE_TTL 来指定算子粒度的空闲状态维持时间,该方式能够使得在上述状态算子中使用与作业级别 table.exec.state.ttl 不同的值。

流连接示例 # 
CREATE TABLE my_table (  
  ...  
) WITH (  
  'connector' = '...',  
  'scan.startup.mode' = 'latest-offset',  
  'state.ttl' = '3h'  -- 设置状态生存时间为3小时  
);

在上面的例子中,state.ttl 被设置为 3h,意味着任何状态数据的生存时间超过 3 小时后都会被自动清理。

更多例子:

CREATE TABLE orders (
  o_orderkey INT,
  o_custkey INT,
  o_status BOOLEAN,
  o_totalprice DOUBLE
) WITH (...);

CREATE TABLE lineitem (
  l_linenumber int,
  l_orderkey int,
  l_partkey int,
  l_extendedprice double
) WITH (...);

CREATE TABLE customers (
  c_custkey int,
  c_address string
) WITH (...);

-- 表名作为 hint 键
SELECT /*+ STATE_TTL('orders'='3d', 'lineitem'='1d') */ * FROM
orders LEFT JOIN lineitem
ON orders.o_orderkey = lineitem.l_orderkey;


-- 别名作为 hint 键
SELECT /*+ STATE_TTL('o'='3d', 'l'='1d') */ * FROM
orders o LEFT JOIN lineitem l
ON o.o_orderkey = l.l_orderkey;

-- 临时视图作为 hint 键
CREATE TEMPORARY VIEW left_input AS SELECT ... FROM orders WHERE ...;
CREATE TEMPORARY VIEW right_input AS SELECT ... FROM lineitem WHERE ...;
SELECT /*+ STATE_TTL('left_input'= '360000s', 'right_input' = '15h') */ * 
FROM left_input JOIN right_input
ON left_input.join_key = right_input.join_key;

-- 级联 join
SELECT /*+ STATE_TTL('o' = '3d', 'l' = '1d', 'c' = '10d') */ *
FROM orders o LEFT OUTER JOIN lineitem l
ON o.o_orderkey = l.l_orderkey
LEFT OUTER JOIN customers c
ON o.o_custkey = c.c_custkey;
分组聚合示例 # 
-- 表名作为 hint 键
SELECT /*+ STATE_TTL('orders' = '1d') */ o_orderkey, SUM(o_totalprice) AS revenue
FROM orders
GROUP BY o_orderkey;

-- 别名作为 hint 键
SELECT /*+ STATE_TTL('o' = '1d') */ o_orderkey, SUM(o_totalprice) AS revenue
FROM orders AS o
GROUP BY o_orderkey;

-- 查询块作为 hint 键
SELECT /*+ STATE_TTL('tmp' = '1d') */ o_orderkey, SUM(o_totalprice) AS revenue
FROM (SELECT o_orderkey, o_totalprice
      FROM orders
      WHERE o_shippriority = 0) tmp
GROUP BY o_orderkey;

注意:

  • 用户既可以选择表(或视图)名也可以选择别名作为提示键,但在指定别名时需要使用别名。
  • 对于多流连接场景,直接指定每张表的生命周期只会在第一个连接算子的左右流和第二个连接算子的右流上生效(因为流上关联操作是二元的)。如果想为每个连接算子的左右流都指定不同生命周期,需要将查询拆成多个查询块,如下所示。
    CREATE TEMPORARY VIEW V AS 
    SELECT /*+ STATE_TTL('A' = '1d', 'B' = '12h')*/ * FROM A JOIN B ON...;
    SELECT /*+ STATE_TTL('V' = '1d', 'C' = '3d')*/ * FROM V JOIN C ON ...;
    
  • STATE_TTL 提示仅作用在当前查询块上。
  • 当 STATE_TTL 提示键重复时取最后一个值。举例来说,在出现 SELECT /*+ STATE_TTL('A' = '1d', 'A' = '2d')*/ * FROM ... 时,输入 A 的 TTL 值将会取 2d。
  • 当出现多个 STATE_TTL 且提示键重复时取第一个值。举例来说,在出现 SELECT /*+ STATE_TTL('A' = '1d', 'B' = '2d'), STATE_TTL('C' = '12h', 'A' = '6h')*/ * FROM ... 时,输入 A 的 TTL 值将会取 1d。
  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后季暖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值