Join-To-Live
Flink双流Join需要将数据存储在状态后端,目前普遍使用Rocksdb作为状态后端。在TTL过大或无法确定TTL或数据流量增加的场景下,大流量会导致状态数据增加,增加存储压力,从而导致作业稳定性下降,或TTL过期可能出现数据关联不准确。
对于数据关联次数确定的业务,可以使用JTL(Join-To-Live)特性减少状态后端压力,JTL指根据关联次数确定数据是否过期,其可以通过如下两种方式配置:
- 仅支持Flink Regular Joins中的inner join语句。
- 不支持与作业级TTL、表级TTL、小表广播特性同时使用。
- 使用JTL特性的表需要指定主键,否则可能导致结果不准确。
- 方式一:可通过SQL Hint使用
eliminate-state.left.threshold:表示左边关联次数的阈值,超过阈值后,该条数据就会过期。
eliminate-state.right.threshold:表示右边关联次数的阈值,超过阈值后,该条数据就会过期。
示例一:
SELECT * FROM t1 JOIN /*+ OPTIONS('eliminate-state.right.threshold'='1', 'eliminate-state.left.threshold'='2') */ t2 ON a1 = a2
示例二:
SELECT a1, a2, a3 from t1 join /*+ OPTIONS('eliminate-state.left.threshold'='1', 'eliminate-state.right.threshold'='2') */ t2 on a1 = a2 join /*+ OPTIONS('eliminate-state.left.threshold'='3', 'eliminate-state.right.threshold'='4') */ t3 on a2 = a3
- 方式二:通过在“客户端安装路径/Flink/flink/conf/flink-conf.yaml”全局配置使用
table.exec.join.eliminate-state.left.threshold table.exec.join.eliminate-state.right.threshold