当前位置: 首页 > 知识库问答 >
问题:

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

敖子安
2023-03-14

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

它类似于:

main() {
   run(some,params)
}

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

如果我以某种程度的并行性运行这个Flink作业,所有并行任务是否都将使用相同的缓存对象?如果没有,如何使它们都使用单个缓存?

缓存用于流的进程()函数内部。所以这就像

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

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

共有2个答案

拓拔意
2023-03-14

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

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

或者,您可以序列化对象并将其存储到像Reid这样的数据库中,然后从数据库中读取并反序列化到对象。

在Flink中,有一种更优雅的方法来实现这一点,您可以将对象存储在状态中,而广播状态可能适合您。

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

希望这有帮助。

湛钊
2023-03-14

将番石榴缓存与Flink一起使用通常是一种反模式。并不是说它不能正常工作,但可能有一个更简单、更可扩展的解决方案。

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

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

 类似资料:
  • 主要内容:1.Table - 双键Map,2.BiMap - 双向Map,3.Multimap - 多值Map,4.RangeMap - 范围Map,5.ClassToInstanceMap - 实例MapGuava是google公司开发的一款Java类库扩展工具包,内含了丰富的API,涵盖了集合、缓存、并发、I/O等多个方面。使用这些API一方面可以简化我们代码,使代码更为优雅,另一方面它补充了很多jdk中没有的功能,能让我们开发中更为高效。 1.Table - 双键Map java中的Map

  • 问题内容: 我正在重构一些代码以使用guava Cache。 初始代码: 为了不破坏某些内容,我需要按原样保留任何引发的异常,而不用包装它。 当前的解决方案看起来有些难看: 有什么办法可以使它变得更好? 问题答案: 刚写完问题,就开始考虑使用泛型的效用方法。然后想起了Throwables的一些东西。是的,它已经在那里!) 可能还需要处理UncheckedExecutionException甚至Ex

  • 我注意到,每次我运行一个新作业时,它所花费的时间比我再次启动它时长20%左右? 如果一个作业运行多次,flink是否缓存一些结果并重用它们?如果是,我如何控制这一点? 我想测量我的任务运行了多长时间,但每次我重新运行它们时,速度都比以前快。

  • 一个spark有一个oracle查询。所以我必须并行运行多个作业,以便所有查询都将同时激发。 如何并行运行多个作业?

  • 问题内容: 我正在测试詹金斯,看它是否适合我们的构建和测试框架。我发现Jenkins及其可用的插件可以满足我们的大多数需求。除了我似乎无法找到有关如何执行一种特定类型任务的帮助。 我们正在为嵌入式设备创建应用程序。我们需要在这些设备上运行100项测试。如果我们在构建后在一台设备上运行所有测试,那么将需要几个小时才能获得结果。但是,如果我们在100个设备上并行运行测试,则可以在更短的时间内获得结果。

  • 主要内容:1 什么是Guava LoadingCache接口,2 Guava LoadingCache接口的语法,3 Guava LoadingCache接口的方法,5 Guava LoadingCache接口的例子1 什么是Guava LoadingCache接口 Guava 通过接口 LoadingCache<K,V> 提供了一个非常强大的基于内存的缓存机制。值会自动加载到缓存中,它提供了许多对缓存需求有用的实用方法。 2 Guava LoadingCache接口的语法 3 Guava Lo