Flink如何处理IterativeStream中的检查点和状态?

时间:2019-02-13 23:48:43

标签: apache-flink flink-streaming

我在documentation中看到:

  

Flink当前仅为不提供作业的处理提供保证   迭代。在迭代作业上启用检查点会导致   例外。为了在迭代程序上强制检查点,   用户在启用检查点时需要设置特殊标志:   env.enableCheckpointing(interval,force = true)。

     

请注意,飞行中的记录在循环边(以及状态   与此相关的更改)将在失败期间丢失。

这是指批处理作业中的迭代还是迭代流,或两者都涉及?

如果它引用迭代流,则在发生故障时以下运算符的什么状态可用? (以from this conversation为例,说明了如何使用<ReferenceInput source="roleId" reference="role" sort={{ field: 'id', order: 'ASC' }} > <AutocompleteInput optionText="name" /> </ReferenceInput> <FormDataConsumer> {({ formData, ...rest }) => ( formData.roleId && <ReferenceField source="roleId" record={{roleId: formData.roleId}} reference="role" basePath={rest.basePath} resource={rest.resource} linkType={false} > <FunctionField render={roleRecord => { if(!roleRecord.needsMeta){ formData.metaId = null; } return roleRecord && roleRecord.needsMeta && ( <ReferenceInput source="metaId" reference="rolemeta" sort={{ field: 'id', order: 'ASC' }} {...rest} > <AutocompleteInput optionText="name" /> </ReferenceInput> ); }} /> </ReferenceField> )} </FormDataConsumer> 在运营商之间共享状态,并以ConnectedIterativeStreams终止迭代。)

.closeWith(stream.broadcast())

如果DataStream<Point> input = ... ConnectedIterativeStreams<Point, Centroids> inputsAndCentroids = input.iterate().withFeedbackType(Centroids.class) DataStream<Centroids> updatedCentroids = inputsAndCentroids.flatMap(new MyCoFlatmap()) inputsAndCentroids.closeWith(updatedCentroids.broadcast()) class MyCoFlatmap implements CoFlatMapFunction<Point, Centroid, Centroid>{...} MyCoFlatmap而不是CoProcessFunction(这也可以保持状态)是否会发生变化?

1 个答案:

答案 0 :(得分:1)

使用迭代时,此限制仅适用于Flink的DataStream / Streaming API。使用DataSet / Batch API时,没有任何限制。

使用流式迭代时,您实际上不会丢失运算符状态,但是可能会丢失记录,这些记录已从运算符通过循环边发送回迭代头。在您的示例中,如果发生故障,从updatedCentroids发送到inputsAndCentroids的记录可能会丢失。因此,在这种情况下,Flink无法保证一经处理就可以完全保证。

实际上有一个Flink improvement proposal可以解决这个缺点。但是,它尚未完成。