在execute
上调用StreamExecutionEnvironment
并启动流作业之前,有没有办法以编程方式找出作业是否已从保存点恢复?我需要知道这些信息,以便在构建作业图时可以根据其设置Kafka源的偏移量。
似乎具有方法FlinkConnectorKafkaBase
的{{1}}类可以访问此类信息(code)。但是,由于initializeState
是FunctionInitializationContext
方法,因此无法拦截isRestored()
并检索initializeState
值。另外,final
方法是在作业图执行后调用的,因此我认为没有可行的解决方案。
我做的另一种尝试是找到一个Flink作业参数,该参数指示该作业是否从保存点开始。但是,我认为这样的参数不存在。
答案 0 :(得分:0)
只需执行以下操作即可获得所需的效果:
FlinkKafkaConsumer<String> myConsumer = new FlinkKafkaConsumer<>(...);
myConsumer.setStartFromEarliest();
如果使用setStartFromEarliest,则Flink将忽略存储在Kafka中的偏移量,而是从最早的记录开始读取。而且,即使您使用setStartFromEarliest,如果Flink从检查点或保存点恢复,它也会使用存储在该快照中的偏移量。
请注意,Flink会执行自己的Kafka偏移量管理,并且从检查点恢复时会忽略存储在Kafka中的偏移量。 Flink这样做是提供一次保证的一部分,该保证要求确切知道消耗了多少输入才能产生在检查点或保存点捕获的其余状态中出现的结果。因此,Flink始终将偏移量存储为每个状态快照(检查点或保存点)的一部分。
关于您最初的关于initializeState
的问题,如果您实现了CheckpointedFunction
接口,则可以使用它,但是实际上很少需要它。