在Flink上更新流图内的并发图

时间:2019-05-20 09:11:27

标签: scala streaming apache-flink

我有一个流在不断地流传输某些键的最新值。

流A:DataStream[(String,Double)]

我还有另一个流,希望在每个流程调用中获取最新值。

我的方法是引入concurrentHashMap,它将由流A更新并由第二个流读取。

val rates = new concurrentHasMap[String,Double].asScala
val streamA : DataStream[(String,Double)]= ???
streamA.map(keyWithValue => rates(keyWithValue._1)= keyWithValue._2) //rates never gets updated
rates("testKey")=2 //this works
val streamB: DataStream[String] = ???
streamB.map(str=> rates(str)  // rates does not contain the values of the streamA at this point
  //some other functionality
) 

是否可以从流中更新并发映射?任何其他与流共享数据的解决方案也是可以接受的

1 个答案:

答案 0 :(得分:4)

您尝试使用的行为将无法以分布式方式起作用,基本上,如果您拥有parellelism> 1,则它将不起作用。在您的代码中rates实际上已更新,但是在并行运算符的不同实例中。

实际上,在这种情况下,您想要使用的是BroadcastState,其目的是完全解决您面临的问题。

在您的特定用例中,看起来像这样:

val streamA : DataStream[(String,Double)]= ???
val streamABroadcasted = streamA.broadcast(<Your Map State Definition>)
val streamB: DataStream[String] = ???
streamB.connect(streamABroadcasted)

然后,您可以轻松地使用BroadcastProcessFunction来实现您的逻辑。可以在here

中找到有关广播状态模式的更多信息