FlinkSQL State的生命周期

FlinkSQL未显示配置state生命周期

FlinkSQL默认没有配置state 的过期时间。也就是说默认情况是FlinkSQL从不清除状态。如果状态后端保存在rocksdb中,直到本地磁盘被打满,服务挂掉,报错如下:

java.io.IOException: [bf3ba881614e80c741fb962c87b7d6fd] Failed to fetch BLOB 12264817074958457302144211122648/p-0b2dedc3a7e6bb642714d445695acf07d6374a9a-3c2bf7d6210f764a50df18d0d6a68d02 from x.x.x.x:25511 and store it under /export/tmp/io_tmp_dirs/blobStore-c0670c38-26c0-43fe-b3b4-9c9de34c4520/incoming/temp-00681209
	at org.apache.flink.runtime.blob.BlobClient.downloadFromBlobServer(BlobClient.java:168)
	at org.apache.flink.runtime.blob.AbstractBlobCache.getFileInternal(AbstractBlobCache.java:166)
	at org.apache.flink.runtime.blob.PermanentBlobCache.getFile(PermanentBlobCache.java:212)
	at org.apache.flink.runtime.execution.librarycache.BlobLibraryCacheManager$LibraryCacheEntry.createUserCodeClassLoader(BlobLibraryCacheManager.java:297)
	at org.apache.flink.runtime.execution.librarycache.BlobLibraryCacheManager$LibraryCacheEntry.getOrResolveClassLoader(BlobLibraryCacheManager.java:268)
	at org.apache.flink.runtime.execution.librarycache.BlobLibraryCacheManager$LibraryCacheEntry.access$1200(BlobLibraryCacheManager.java:233)
	at org.apache.flink.runtime.execution.librarycache.BlobLibraryCacheManager$DefaultClassLoaderLease.getOrResolveClassLoader(BlobLibraryCacheManager.java:393)
	at org.apache.flink.runtime.taskmanager.Task.createUserCodeClassloader(Task.java:1158)
	at org.apache.flink.runtime.taskmanager.Task.doRun(Task.java:715)
	at org.apache.flink.runtime.taskmanager.Task.run(Task.java:644)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: No space left on device
	at java.io.FileOutputStream.writeBytes(Native Method)
	at java.io.FileOutputStream.write(FileOutputStream.java:326)
	at org.apache.flink.runtime.blob.BlobClient.downloadFromBlobServer(BlobClient.java:146)
	... 10 more

FlinkSQL state 生命周期配置

对于有状态计算的流连接和分组聚合操作,用户可以通过 STATE_TTL 来指定算子粒度的生命周期,该方式的状态配置优先级大于【table.exec.state.ttl】作业级别的状态优先级配置。

方式1

作业级别设置

-- 单位:ms,1小时
SET table.exec.state.ttl = 3600000

方式2

流连接时配置,默认没有状态

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

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

方式3

分组聚合时,hints方式配置,SQL 提示(SQL Hints)是和 SQL 语句一起使用来改变执行计划的。

-- 表名作为 hint 键
SELECT /*+ STATE_TTL('orders' = '30d') */ o_orderkey, SUM(o_totalprice) AS revenue
FROM orders
GROUP BY o_orderkey;
 
-- 别名作为 hint 键
SELECT /*+ STATE_TTL('o' = '30d') */ o_orderkey, SUM(o_totalprice) AS revenue
FROM orders AS o
GROUP BY o_orderkey;
 
-- 查询块作为 hint 键
SELECT /*+ STATE_TTL('tmp' = '30d') */ 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。

优先级:

方式2(流连接) 、方式3(分组聚合) > 方式1(作业级别)

相关推荐

  1. Vue生命周期

    2024-04-24 12:42:04       63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-24 12:42:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-24 12:42:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-24 12:42:04       82 阅读
  4. Python语言-面向对象

    2024-04-24 12:42:04       91 阅读

热门阅读

  1. Android Binder——数据传递载体(二十一)

    2024-04-24 12:42:04       36 阅读
  2. 定时备份mysql数据库

    2024-04-24 12:42:04       35 阅读
  3. 100.qt qml-MultiPointTouchArea多点触摸缩放拖拽

    2024-04-24 12:42:04       29 阅读
  4. Mysql 8.0 的一些坑

    2024-04-24 12:42:04       38 阅读
  5. Eureka详解

    2024-04-24 12:42:04       30 阅读
  6. css-深度选择器-vue2

    2024-04-24 12:42:04       37 阅读
  7. 整理Meta GDC 2024 上关于XR、空间计算相关的分享

    2024-04-24 12:42:04       34 阅读
  8. 软件步骤2:OpenMVG特征提取(基于SFM场景)

    2024-04-24 12:42:04       25 阅读
  9. matlab代码

    2024-04-24 12:42:04       33 阅读
  10. 代码随想录算法Day34(2)||LeetCode134.加油站

    2024-04-24 12:42:04       31 阅读
  11. python基础知识四(列表、元组、函数)

    2024-04-24 12:42:04       30 阅读
  12. 【ARM Coresight 系列文章19.3 -- ARM DSU 120 Debug block】

    2024-04-24 12:42:04       31 阅读
  13. 【electron报错】 electron-buidler打包sqlite3问题汇总

    2024-04-24 12:42:04       34 阅读