广播流的一种替代方法



我的flink工作中有两个不同的流;

  • 第一个是表示将应用于实际流的一组规则。我刚刚公布了这些规则。变化来自卡夫卡,每小时可能会有一些变化(比如每小时100-200(
  • 第二个是实际流,称为客户流,其中包含每个客户的一些数值。这基本上是基于customerId的键控流

所以,基本上我正在准备我的实际客户流数据,然后在键控流上应用some rules,并获得计算结果。

而且,我还知道应该通过检查客户流数据字段来计算哪些规则。例如客户数据字段包含值X,这意味着作业必须仅应用rule1, rule2, rule5,而不是计算给定客户的所有规则(假设有90条规则(。当然,在这种情况下,我必须根据传入数据的字段值来获取和筛选所有规则。

在这个场景中一切都很好,并且非常适合广播模式的使用。但这里的问题是巨大的广播规模。有时它可能非常巨大,比如20 GB或更多。它认为这对广播州来说是非常巨大的。

有没有其他方法可以解决这一限制?比如,使用rocks数据库后端(我知道它不受支持,但如果没有限制,我可以为广播状态实现自定义状态后端(。

如果我在没有广播规则流的情况下连接两个流,会有什么变化吗?

根据您的描述,您似乎可以避免广播规则(通过扭转局面并将主流广播到规则(。也许这可以奏效:

  1. 确保每个传入的客户活动都有一个唯一的ID
  2. 键对规则进行分区,使每个规则都有一个不同的键
  3. 将主流事件广播到规则(并且不存储客户事件(
  4. 联合应用所有规则的输出
  5. key根据步骤(1(中的唯一ID,将每个规则应用于给定客户事件的结果汇总在一起,并组合一个统一的结果

https://gist.github.com/alpinegizmo/5d5f24397a6db7d8fabc1b12a15eeca6显示了如何使用Flink进行扇出/扇入操作——请参阅上面步骤1、4和5的示例。

如果无法对规则数据集进行分区,那么我认为尝试连接流不会成功。

我会将ApacheIgnite作为一种在处理客户流的所有子任务之间共享规则的方式。请参阅这篇文章,以了解如何实现这一点。

相关内容

  • 没有找到相关文章

最新更新