如何将Flink作业与Guava缓存并行化?

问题描述 投票:0回答:2

我写了一个使用Guava缓存的Flink作业。缓存对象是在main()函数中调用的run()函数中创建和使用的。

它是这样的:

main() {
   run(some,params)
}

run() {
   //create and use Guava cache object here
}

如果我运行这个Flink作业,具有一定程度的并行性,那么所有并行任务都会使用相同的缓存对象吗?如果没有,我怎么能让他们都使用一个缓存?

缓存在流的process()函数内使用。所以它就像

incoming_stream.process(new ProcessFunction() { //Use Guava Cache here })  

您可以将我的用例视为基于缓存的重复数据删除,因此我希望所有并行任务都引用单个缓存对象

caching parallel-processing guava apache-flink flink-streaming
2个回答
1
投票

使用带Flink的Guava缓存通常是一种反模式。并不是说它无法工作,但可能有一个更简单,更具伸缩性的解决方案。

使用Flink以完全可扩展,高效的方式进行重复数据删除的标准方法是通过某个键(使用keyBy)对流进行分区,然后使用键控状态来记住已经看到的键。 Flink的键控状态由Flink管理,使其具有容错性和可重新缓存性,同时保持本地状态。 Flink的键控状态是分片键/值存储,每个实例处理键空间的某些部分的所有事件。您可以保证,对于每个密钥,同一个密钥的所有事件都将由同一个实例处理 - 这就是为什么这适用于重复数据删除。

如果您需要所有并行实例都拥有某些(可能正在发展的)数据集的完整副本,那就是广播状态的用途。


0
投票

Flink任务在多个JVM或机器上运行,因此问题是如何在JVM之间共享对象。

通常,您可以通过RPC(通过tcp)或rest(通过http)调用从远程JVM获取对象。

或者,您可以序列化对象并将它们存储到数据库(如reid),然后从数据库中读取并反序列化为对象。

在Flink中,有一种更优雅的方式来实现这一点,你可以在state存储对象,而broadcast_state可能适合你。

引入广播状态是为了支持需要将来自一个流的一些数据广播到所有下游任务的用例

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.