我写了一个使用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 })
您可以将我的用例视为基于缓存的重复数据消除,因此我希望所有并行任务都引用单个缓存对象
2条答案
按热度按时间z9smfwbn1#
将Guava缓存与flink一起使用通常是一种反模式。并不是说它不能工作,但可能有一个更简单和更可扩展的解决方案。
使用flink以一种完全可扩展、高性能的方式进行重复数据消除的标准方法是按某个键(使用keyby)对流进行分区,然后使用keyed state来记住已看到的键。flink的键控状态由flink管理,使其具有容错性和可扩展性,同时保持其本地性。flink的keyed状态是一个分片键/值存储,每个示例处理键空间某个部分的所有事件。您可以保证,对于每个密钥,同一密钥的所有事件都将由同一示例处理——这就是为什么这对于重复数据消除非常有效的原因。
如果您需要所有并行示例都有某个(可能正在演变的)数据集的完整副本,那么广播状态就是为了这个。
zpjtge222#
flink任务运行在多个jvm或机器上,所以问题是如何在jvm之间共享对象。
通常,您可以通过rpc(通过tcp)或rest(通过http)调用从远程jvm获取对象。
或者,您可以序列化对象并将它们存储到像reid这样的数据库中,然后从数据库中读取并反序列化到对象。
在flink中,有一种更优雅的方法来实现这一点,您可以将对象存储在状态中,而广播状态可能适合您。
广播状态被引入以支持来自一个流的一些数据需要广播到所有下游任务的用例
希望这有帮助。