首页 > 解决方案 > 如何使用 Guava 缓存并行化 Flink 作业?

问题描述

我写了一个使用 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 })  

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

标签: cachingparallel-processingguavaapache-flinkflink-streaming

解决方案


在 Flink 中使用 Guava 缓存通常是一种反模式。并不是说它不能工作,而是可能有一个更简单、更具可扩展性的解决方案。

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

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


推荐阅读