有没有一种方法可以在执行流之前以编程方式检查Flink流作业是否从保存点启动?

时间:2019-10-12 15:56:07

标签: apache-flink flink-streaming

execute上调用StreamExecutionEnvironment并启动流作业之前,有没有办法以编程方式找出作业是否已从保存点恢复?我需要知道这些信息,以便在构建作业图时可以根据其设置Kafka源的偏移量。

似乎具有方法FlinkConnectorKafkaBase的{​​{1}}类可以访问此类信息(code)。但是,由于initializeStateFunctionInitializationContext方法,因此无法拦截isRestored()并检索initializeState值。另外,final方法是在作业图执行后调用的,因此我认为没有可行的解决方案。

我做的另一种尝试是找到一个Flink作业参数,该参数指示该作业是否从保存点开始。但是,我认为这样的参数不存在。

1 个答案:

答案 0 :(得分:0)

只需执行以下操作即可获得所需的效果:

FlinkKafkaConsumer<String> myConsumer = new FlinkKafkaConsumer<>(...);
myConsumer.setStartFromEarliest(); 

如果使用setStartFromEarliest,则Flink将忽略存储在Kafka中的偏移量,而是从最早的记录开始读取。而且,即使您使用setStartFromEarliest,如果Flink从检查点或保存点恢复,它也会使用存储在该快照中的偏移量。

请注意,Flink会执行自己的Kafka偏移量管理,并且从检查点恢复时会忽略存储在Kafka中的偏移量。 Flink这样做是提供一次保证的一部分,该保证要求确切知道消耗了多少输入才能产生在检查点或保存点捕获的其余状态中出现的结果。因此,Flink始终将偏移量存储为每个状态快照(检查点或保存点)的一部分。

已记录在herehere中。

关于您最初的关于initializeState的问题,如果您实现了CheckpointedFunction接口,则可以使用它,但是实际上很少需要它。