一步一个脚印,一天一道面试题
简单写几个 Flink SQL
的优化
1.JOIN 时指定 TTL
- 设置空闲状态自动清理(TTL Time-to-Live),这个是Flink SQL join 时,必须的优化项,因为当 Flink SQL 进行
join
时,由于可能会出现某张表数据来得晚而没办法 join 成功,所以Flink 默认join
时数据都存储在内存中,不会清理。 因此程序运行时间长后,一定会发生卡顿的情况。
// 方式1:
Configuration configuration = tableEnv.getConfig().getConfiguration();
configuration.setString("table.exec.state.ttl","5 s");
// 方式2:
tableEnv.getConfig().setIdleStateRetention(Duration.ofSeconds(5));
2.优化状态管理
Flink
的状态管理对整个程序的性能有较大影响。所以优化效果比较好。
- 数据量大时选择
RocksDBStateBackend
// 设置 RockDB 状态后端
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStateBackend(new EmbeddedRocksDBStateBackend());
3.Checkpoint 策略优化
检查点机制是会一定程度影响程序性能的,
- 设置较长时间
Checkpoint
- 如果不必要的话可以不设置精确一次性(Excatly-Once)
- 可以的话设置增量检查点状态快照
// 每10秒一次Checkpoint,精确一次语义
env.enableCheckpointing(10 * 1000L, CheckpointingMode.AT_LEAST_ONCE);
// 在 1.15 之前,只有 RocksDB 支持增量快照
EmbeddedRocksDBStateBackend backend = new EmbeddedRocksDBStateBackend(true);
两篇很不错的 Flink SQL 优化文章:
flink sql 优化
FlinkSql通用调优策略
我是近未来,祝你变得更强