我在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
(这也可以保持状态)是否会发生变化?
答案 0 :(得分:1)
使用迭代时,此限制仅适用于Flink的DataStream
/ Streaming API。使用DataSet
/ Batch API时,没有任何限制。
使用流式迭代时,您实际上不会丢失运算符状态,但是可能会丢失记录,这些记录已从运算符通过循环边发送回迭代头。在您的示例中,如果发生故障,从updatedCentroids
发送到inputsAndCentroids
的记录可能会丢失。因此,在这种情况下,Flink无法保证一经处理就可以完全保证。
实际上有一个Flink improvement proposal可以解决这个缺点。但是,它尚未完成。