嘿,我很难理解共享状态(ValueState,ListState,..(在flink中是如何工作的。如果一个任务的多个实例并行运行,flink如何防止竞争条件?
在这个来自文档的例子中,如果操作符是并行的,那么flink如何保证在读取和更新keyHasBeenSen值之间没有竞争条件?
public static class Deduplicator extends RichFlatMapFunction<Event, Event> {
ValueState<Boolean> keyHasBeenSeen;
@Override
public void open(Configuration conf) {
ValueStateDescriptor<Boolean> desc = new ValueStateDescriptor<>("keyHasBeenSeen", Types.BOOLEAN);
keyHasBeenSeen = getRuntimeContext().getState(desc);
}
@Override
public void flatMap(Event event, Collector<Event> out) throws Exception {
if (keyHasBeenSeen.value() == null) {
out.collect(event);
keyHasBeenSeen.update(true);
}
}
}
Flink中没有任何共享状态。共享状态会增加复杂性并损害可扩展性。
value
和update
方法的作用域是当前事件的键。对于任何给定的键,该键的所有事件都由运算符/函数的同一实例处理。所有任务(一个任务是一个操作符/函数实例链(都是单线程的。
通过保持这样的简单,没有什么可担心的。