我有一个用例,其中apache flink进程必须集成来自多个源的近乎实时的数据流(事件),但由于不同系统中缺乏统一的键,我需要使用现有数据库中的代理键(SK)查找。SK数据集非常大(50个Million+密钥)。缓存这样的数据集用于流中转换(映射)而不使用DB查找是否可能/可取?如果是,缓存的限制是什么?如果不是,Flink有哪些替代方案?
发布于 2019-12-11 19:15:35
这里有几个选项
本地地图
如果代理键永远不会改变,那么您可以将其加载到RichMapFunction#open中并执行查找。当然,这意味着您必须调整内存设置,以便Flink不会尝试为自己的操作占用所有内存。
一些简单的数学运算:假设两个键都是长度为10的字符串,它们在内存中都需要40字节的字符。加上一些对象开销,我们将达到每个条目大约50个字节。对于5000万个条目,我们需要2.5 GB的RAM来存储它。因为散列映射会有一些开销,所以我计划使用3 GB的RAM。
因此,如果您的任务管理器有8 GB,我会将taskmanager.memory.size设置为4 GB。
Ofc,您需要确保同一任务管理器的不同任务不会两次加载相同的映射。此外,我会选择一种适合于尽可能快地加载数据的格式(例如,Avro),因为缓慢的解析将大大减少启动和恢复时间。
基于状态
如果内存有问题或数据正在更改,您还可以将查找数据建模为map-state。我将为该查找数据添加第二个输入,并使用KeyedCoProcessFunction。来自映射状态的第二个输入的提要。状态应该使用rocks-db后端,这样数据就可以有效地驻留在磁盘上。
连接数据
查找也可以建模为联接。如果您已经在使用Table API,请看一下Join with Temporal Table。这将在内部使用基于状态的方法,但更简洁。您也可以使用mix DataStream with Tables。
https://stackoverflow.com/questions/59267652
复制相似问题