哪个设置检查点间隔(毫秒)?

Which set checkpointing interval (ms)?

大家。
请帮我。
我编写了 apache flink streraming 作业,它从 apache kafka 读取 json 消息(秒内 500-1000 条消息),在 POJO 中反序列化它们并执行一些操作(filter-keyby-process-sink)。我使用了具有 ExactlyOnce 语义的 RocksDB 状态后端。但是我不明白我需要设置哪个检查点间隔?
一些论坛的人大多写 1000 或 5000 毫秒。 我尝试设置间隔10ms、100ms、500ms、1000ms、5000ms。我没有注意到任何差异。

有两个因素支持一个合理的小检查点间隔:

(1) 如果您正在使用执行两阶段事务提交的接收器,例如 Kafka 或 StreamingFileSink,那么这些事务只会在检查点期间提交。因此,您作业输出的任何下游消费者都会遇到由检查点间隔控制的延迟。

请注意,除非您采取了端到端的精确一次语义所需的所有步骤,否则 Kafka 不会遇到这种延迟。这意味着您必须在 Kafka 生产者中设置 Semantic.EXACTLY_ONCE,并将下游消费者中的 isolation.level 设置为 read_committed。如果你这样做,你还应该增加 transaction.max.timeout.ms 超过默认值(即 15 分钟)。有关更多信息,请参阅 docs

(2) 如果您的作业失败并需要从检查点恢复,输入将倒回到检查点中记录的偏移量,处理将从那里恢复。如果检查点间隔很长(例如 30 分钟),那么您的作业可能需要相当长的时间才能恢复到再次近乎实时地处理事件的点(假设您正在处理实时数据)。

另一方面,检查点确实会增加一些开销,所以如果经常这样做会影响性能。

除了@David描述的几点外,我的建议也是使用下面的函数来配置checkpoint时间:

StreamExecutionEnvironment.getCheckpointConfig().setMinPauseBetweenCheckpoints(milliseconds)

这样,您可以保证在状态变得比计划大或创建检查点的存储速度慢的情况下您的工作能够取得一些进展。

我建议阅读 Tuning Checkpointing 上的 Flink 文档以更好地理解这些场景。