如何组织一个复杂的 Apache Flink 应用程序



我正在评估Apache Flink的用例。 我的问题是如何组织"复杂"流的代码。

用例是一个物联网过程。传感器产生事件 - 这是我流的输入。我的流应用程序输出警报。 我的流的第一步是处理这些数据上的一些聚合特征(窗口平均值、最小值、最大值等)。我的流的第二步是对输入数据和聚合数据运行一些"决策"过程。第二步由 2 个并行过程组成:

  • 第一个是一组用户定义的规则(例如:如果温度传感器平均值为>50°,但最新的温度传感器低于 30°,则生成警报)
  • 第二个是运行一些机器学习模型

我想做什么的图表:

+-----------------+               
+----------------+         |   User rules    |------>  Alerts
|                |-------->|   (multiple)    |               
|   Aggregates   |         +-----------------+               
Sensors ------->|                |                                           
|   (multiple)   |         +-----------------+               
|                |-------->|    ML rules     |-------> Alerts
+----------------+         |   (multiple)    |               
+-----------------+               

我应该如何组织我的 Flink 应用程序?

我想到了3种方法:

1)把我所有的代码放在一个项目中

优点:

  • 这会将所有代码放在同一个位置,无需切换到数十个应用程序即可了解它的工作原理和作用。
  • 我不需要在任何其他主题中存储中间结果 - 我将能够直接使用它们。
  • 易于部署

缺点:

  • 应用程序的主文件可能很快就会变得一团糟(会吗?
  • 每次更新某些内容(新规则、新聚合等)时,我都必须重新部署所有内容

2)将扩充部分放在一个项目中,将所有用户定义的规则放在另一个项目中,将机器学习部分放在另一个项目中

优点:

  • 做同样事情的代码在同一个地方
  • 看起来易于部署。只需部署 3 个应用程序

缺点:

我必须使用
  • 代理,以便生产者和消费者可以通信(聚合被写入主题,然后用户规则去读取它们以使用它们),我必须加入流

3)每个要处理的聚合都是一个项目,每个规则都是一个项目,每个ML模型都是一个项目

优点:

  • 轻松更新。将与团队一起扩展。
  • 新手写东西而不破坏一切的简单方法
  • 似乎它可以很好地扩展 - 耗时的用户定义规则不会影响其他人

缺点:

  • 跟踪部署的内容及其版本的混乱
  • 我必须使用
  • 代理,以便生产者和消费者可以通信(聚合被写入主题,然后用户规则去读取它们以使用它们),我必须加入流
  • 大量冗余代码/可能需要创建库
  • 如果我得到成百上千个聚合和规则,部署可能会变得一团糟

我错过了 Flink 和一般流媒体的经验,不知道什么最适合我的用例。我正在考虑从第二个解决方案开始,这似乎是最好的折衷方案。

您可能需要考虑的一种方法是流式传输一些缓慢变化的组件,而不是编译它们。例如,用户规则,甚至是聚合定义和机器学习模型。这将增加实现的复杂性,但允许进行更改而无需重新部署。

King的RBEA和ING在流ML模型上的工作就是这种模式的早期例子。有了广播状态,现在使用 Flink 构建这种动态规则引擎变得更加容易了。

相关内容

  • 没有找到相关文章

最新更新