caching - 如何使用 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 })
您可以将我的用例视为基于缓存的重复数据删除,因此我希望所有并行任务都引用单个缓存对象
解决方案
在 Flink 中使用 Guava 缓存通常是一种反模式。并不是说它不能工作,而是可能有一个更简单、更具可扩展性的解决方案。
使用 Flink 以完全可扩展、高性能的方式进行重复数据删除的标准方法是通过某个键(使用 keyBy)对流进行分区,然后使用键控状态来记住已经看到的键。Flink 的键控状态由 Flink 管理,使其具有容错性和可重新扩展性,同时保持本地化。Flink 的键控状态是一个分片键/值存储,每个实例处理键空间的某些部分的所有事件。您可以保证对于每个键,同一键的所有事件都将由同一实例处理——这就是为什么这适用于重复数据删除。
如果您需要所有并行实例都具有某些(可能不断发展的)数据集的完整副本,那么这就是广播状态的用途。
推荐阅读
- node.js - Dialogflow 和 google action MediaObject 集成
- c# - .net core 2.0 解析器问题与身份角色
- javascript - 无法将 nightwatch.js 页面对象的 locateStrategy 设置为“链接文本”
- ios - Gamecenter 设置验证处理程序崩溃
- git - 知道谁在 Gitlab 中将项目克隆到他们的本地系统
- php - Ajax 代码在本地主机上工作,但不在服务器上
- apache - 请求的 URL 被拒绝。
- kubernetes - Kubernetes - 来自其他 pod 的入口网络策略
- php - 如何在php中使用switch case为动态页面标题匹配半个URL?
- swift - SocketIOClient:处理事件:数据错误:[“无效的 SSL 证书”]