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

时间:2019-04-30 15:17:21

标签: 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和一般流媒体方面的经验,以了解哪种方法最适合我的用例。我正在考虑从第二个解决方案开始,这似乎是最好的折衷方案。

1 个答案:

答案 0 :(得分:1)

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

RBEA from KingING's work on streaming ML models是这种模式的早期示例。通过广播状态,现在可以使用Flink轻松构建这种动态规则引擎。