Flink SQL 调优
一、设置空闲状态保留时间
Flink SQL 新手有可能犯的错误,其中之一就是忘记设置空闲状态保留时间导致状态爆炸。列举两个场景:
- Flink SQL 的 regular join(inner、left、right),左右表的数据会一直保存在状态里,不会清理。要么设置 TTL,要么使用 Flink SQL 的 interval join。
 - 使用 Top-N 语法进行去重,重复数据的出现一般都位于特定区间内(例如一小时或一天内),过了这段时间之后,对应的状态就不再需要了。
 
Flink SQL 可以指定空闲状态(未更新的状态)被保留的最小时间,当状态中某个 key 对应的状态未更新的时间到达阈值时,该条状态被自动清理:
#API 指定
tableEnv.getConfig().setIdleStateRetention(Duration.ofHours(1));
#参数指定
Configuration configuration = tableEnv.getConfig().getConfiguration();
configuration.setString("table.exec.state.ttl", "1 h"); 
二、开启 MiniBatch
MiniBatch 是微批处理,原理是缓存一定的数据后再触发处理,以减少对 State 的访问,从而提升吞吐并减少数据的输出量。MiniBatch 主要依靠在每个 Task 上注册一个 Timer 线程来触发微批,需要消耗一定的线程调度性能。
2.1 开启方式
MiniBatch 默认关闭,开启方式如下:
// 初始化 table environment
TableEnvironm