Apache flink 如何更新MapState上的值而不删除以前的值?

Apache flink 如何更新MapState上的值而不删除以前的值?,apache-flink,flink-streaming,flink-cep,Apache Flink,Flink Streaming,Flink Cep,我这次的问题是:使用MapState时,可以安全地使用MapState.putkey,value将密钥的当前值修改为MapState,或者我需要执行MapState.removekey,然后再执行MapState.putkey,value,或者是否仍要更新此值 从Flink开始,状态抽象不是为并发访问而设计的,不应该在多个线程之间共享。那么,重新表述我的问题:我是否可以根据一个键将值更新为mapState,而不删除该键,然后再次放置该键?如何使用mapState避免ConcurrentModif

我这次的问题是:使用MapState时,可以安全地使用MapState.putkey,value将密钥的当前值修改为MapState,或者我需要执行MapState.removekey,然后再执行MapState.putkey,value,或者是否仍要更新此值

从Flink开始,状态抽象不是为并发访问而设计的,不应该在多个线程之间共享。那么,重新表述我的问题:我是否可以根据一个键将值更新为mapState,而不删除该键,然后再次放置该键?如何使用mapState避免ConcurrentModificationException,而不为此操作符将并行度设置为1

因为我有一个例外:

java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)
at java.util.HashMap$EntryIterator.next(HashMap.java:1479)
at java.util.HashMap$EntryIterator.next(HashMap.java:1477)
at org.apache.flink.api.common.typeutils.base.MapSerializer.copy(MapSerializer.java:111)
at org.apache.flink.api.common.typeutils.base.MapSerializer.copy(MapSerializer.java:49)
at org.apache.flink.runtime.state.heap.CopyOnWriteStateTable.get(CopyOnWriteStateTable.java:287)
at org.apache.flink.runtime.state.heap.CopyOnWriteStateTable.get(CopyOnWriteStateTable.java:311)
at org.apache.flink.runtime.state.heap.HeapMapState.get(HeapMapState.java:85)
at org.apache.flink.runtime.state.ttl.TtlMapState.lambda$getWrapped$0(TtlMapState.java:63)
at org.apache.flink.runtime.state.ttl.AbstractTtlDecorator.getWrappedWithTtlCheckAndUpdate(AbstractTtlDecorator.java:92)
at org.apache.flink.runtime.state.ttl.TtlMapState.getWrapped(TtlMapState.java:62)
at org.apache.flink.runtime.state.ttl.TtlMapState.contains(TtlMapState.java:92)
at org.apache.flink.runtime.state.UserFacingMapState.contains(UserFacingMapState.java:72)
at com.teavaro.cep.transformations.SessionUseCase$1.generateSessionRecord(SessionUseCase.java:65)
at com.teavaro.cep.transformations.SessionUseCase$1.generateSessionRecord(SessionUseCase.java:42)
at com.teavaro.cep.operators.SessionIdentificationProcessFunction.process(SessionIdentificationProcessFunction.java:25)
at org.apache.flink.streaming.runtime.operators.windowing.functions.InternalIterableProcessWindowFunction.process(InternalIterableProcessWindowFunction.java:50)
at org.apache.flink.streaming.runtime.operators.windowing.functions.InternalIterableProcessWindowFunction.process(InternalIterableProcessWindowFunction.java:32)
at org.apache.flink.streaming.runtime.operators.windowing.WindowOperator.emitWindowContents(WindowOperator.java:546)
at org.apache.flink.streaming.runtime.operators.windowing.WindowOperator.onEventTime(WindowOperator.java:454)
at org.apache.flink.streaming.api.operators.InternalTimerServiceImpl.advanceWatermark(InternalTimerServiceImpl.java:251)
at org.apache.flink.streaming.api.operators.InternalTimeServiceManager.advanceWatermark(InternalTimeServiceManager.java:128)
at org.apache.flink.streaming.api.operators.AbstractStreamOperator.processWatermark(AbstractStreamOperator.java:774)
at org.apache.flink.streaming.runtime.io.StreamInputProcessor$ForwardingValveOutputHandler.handleWatermark(StreamInputProcessor.java:262)
at org.apache.flink.streaming.runtime.streamstatus.StatusWatermarkValve.findAndOutputNewMinWatermarkAcrossAlignedChannels(StatusWatermarkValve.java:189)
at org.apache.flink.streaming.runtime.streamstatus.StatusWatermarkValve.inputWatermark(StatusWatermarkValve.java:111)
at org.apache.flink.streaming.runtime.io.StreamInputProcessor.processInput(StreamInputProcessor.java:184)
at org.apache.flink.streaming.runtime.tasks.OneInputStreamTask.run(OneInputStreamTask.java:105)
at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:300)
at org.apache.flink.runtime.taskmanager.Task.run(Task.java:711)
at java.lang.Thread.run(Thread.java:748)

非常感谢。亲切问候。

只需调用put即可更新MapState中的条目。无需先删除现有值。

只需调用put即可更新MapState中的条目。无需先删除现有值。

您一定是做了一些不寻常的事情才遇到这种情况。但要回答您的问题,只需拨打put进行更新即可。无需先删除现有值。此外,mapState适用于并行度高于1的运算符。对并发访问的限制在操作员的给定实例内。再次非常感谢David,我是Flink和Stream Processing的新手,很抱歉,如果我的问题与平常不同,我会问,因为我在其他地方找不到答案。顺便说一句,mapState正在工作,非常感谢您所做的一切。您一定是做了一些不寻常的事情才遇到了这个问题。但要回答您的问题,只需拨打put进行更新即可。无需先删除现有值。此外,mapState适用于并行度高于1的运算符。对并发访问的限制在操作员的给定实例内。再次非常感谢David,我是Flink和Stream Processing的新手,很抱歉,如果我的问题与平常不同,我会问,因为我在其他地方找不到答案。顺便说一句,mapState正在工作,非常感谢您所做的一切。