Apache Flink:ConnectedStreams中ValueState的范围

时间:2016-11-15 15:28:42

标签: apache-flink flink-streaming

我有一个使用RichCoFlatMapFunction成员的自定义ValueState。文档说

  

键/值接口的范围限定为当前输入元素的键

请参阅https://ci.apache.org/projects/flink/flink-docs-master/dev/state.html#using-the-keyvalue-state-interface

如果我像这样键入连接的流,该怎么办:

val connected = streamA
    .connect(streamB)
    .keyBy(a=>a.foo, b=>b.bar)
    .flatMap(new MyRichCoFlatMapFunction)

那么语义是怎样的呢?它是否与第一个,第二个或两者的组合有关?

1 个答案:

答案 0 :(得分:3)

keyBya => a.foo)的第一个参数定义了第一个流的关键字(streamA)。第二个参数(b => b.bar)是第二个流的关键字(streamB)。两个参数都必须返回相同类型的键,即a.foob.bar的类型必须相同。

然后,connect运算符将所有来自streamAstreamB的记录以相同的密钥发送给同一运营商。有状态RichCoFlatMapFunction将为当前元素的键设置ValueState,即,如果为flatMap1(a: TypeA, out: Collector[TypeOut])的值调用streamA,则为该键设置状态a.foo如果flatMap2(b: TypeB, out: Collector[TypeOut])调用了来自streamB的值,则会为密钥b.bar设置状态。