代理网站下载,wordpress右浮动图,wordpress上传空间后,做淘宝的导购网站FlinkSQL未显示配置state生命周期
FlinkSQL默认没有配置state 的过期时间。也就是说默认情况是FlinkSQL从不清除状态。如果状态后端保存在rocksdb中#xff0c;直到本地磁盘被打满#xff0c;服务挂掉#xff0c;报错如下#xff1a;
java.io.IOException: [bf3ba881614e…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-00681209at 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 deviceat 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
作业级别设置
-- 单位ms1小时
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
分组聚合时hit方式配置
-- 表名作为 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_totalpriceFROM ordersWHERE 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作业级别