我的flink工作中有两个不同的流;
- 第一个是表示将应用于实际流的一组规则。我刚刚公布了这些规则。变化来自卡夫卡,每小时可能会有一些变化(比如每小时100-200(
- 第二个是实际流,称为客户流,其中包含每个客户的一些数值。这基本上是基于customerId的键控流
所以,基本上我正在准备我的实际客户流数据,然后在键控流上应用some rules
,并获得计算结果。
而且,我还知道应该通过检查客户流数据字段来计算哪些规则。例如客户数据字段包含值X
,这意味着作业必须仅应用rule1, rule2, rule5
,而不是计算给定客户的所有规则(假设有90条规则(。当然,在这种情况下,我必须根据传入数据的字段值来获取和筛选所有规则。
在这个场景中一切都很好,并且非常适合广播模式的使用。但这里的问题是巨大的广播规模。有时它可能非常巨大,比如20 GB或更多。它认为这对广播州来说是非常巨大的。
有没有其他方法可以解决这一限制?比如,使用rocks数据库后端(我知道它不受支持,但如果没有限制,我可以为广播状态实现自定义状态后端(。
如果我在没有广播规则流的情况下连接两个流,会有什么变化吗?
根据您的描述,您似乎可以避免广播规则(通过扭转局面并将主流广播到规则(。也许这可以奏效:
- 确保每个传入的客户活动都有一个唯一的ID
- 键对规则进行分区,使每个规则都有一个不同的键
- 将主流事件广播到规则(并且不存储客户事件(
- 联合应用所有规则的输出
- key根据步骤(1(中的唯一ID,将每个规则应用于给定客户事件的结果汇总在一起,并组合一个统一的结果
https://gist.github.com/alpinegizmo/5d5f24397a6db7d8fabc1b12a15eeca6显示了如何使用Flink进行扇出/扇入操作——请参阅上面步骤1、4和5的示例。
如果无法对规则数据集进行分区,那么我认为尝试连接流不会成功。
我会将ApacheIgnite作为一种在处理客户流的所有子任务之间共享规则的方式。请参阅这篇文章,以了解如何实现这一点。