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

Apache flink 如何组织复杂的Apache Flink应用程序,apache-flink,Apache Flink,我正在评估ApacheFlink的用例。 我的问题是如何组织“复杂”流的代码 用例是一个物联网过程。传感器产生事件-这是我的流的输入。我的流应用程序输出警报。 流的第一步是处理这些数据上的一些聚合特性(窗口平均值、最小值、最大值等)。流的第二步是对输入数据和聚合数据运行一些“决策”过程。第二步由2个并行过程组成: 第一个是一组用户定义的规则(例如:如果温度传感器平均值>50°,但最近一个低于30°,则生成警报) 第二个是运行一些机器学习模型 我想做什么的图表:

我正在评估ApacheFlink的用例。 我的问题是如何组织“复杂”流的代码

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

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

                                             +-----------------+               
                  +----------------+         |   User rules    |------>  Alerts
                  |                |-------->|   (multiple)    |               
                  |   Aggregates   |         +-----------------+               
  Sensors ------->|                |                                           
                  |   (multiple)   |         +-----------------+               
                  |                |-------->|    ML rules     |-------> Alerts
                  +----------------+         |   (multiple)    |               
                                             +-----------------+               
我应该如何组织我的Flink应用程序

我有三种方法:

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

优点:

  • 这将把所有的代码放在同一个地方,不需要切换到几十个应用程序来了解它是如何工作的以及它是做什么的
  • 我不需要在任何其他主题中存储中间结果-我可以直接使用它们
  • 易于部署
缺点:

  • 应用程序的主文件可能很快就会变得一团糟(会吗?)
  • 每次更新某些内容(新规则、新聚合等)时,我都必须重新部署所有内容
2)将充实部分放在一个项目中,将所有用户定义的规则放在另一个项目中,将机器学习部分放在另一个项目中

优点:

  • 执行相同操作的代码位于同一位置
  • 看起来很容易部署。只需部署3个应用程序
缺点:

  • 我必须使用一个代理,这样生产者和消费者才能进行交流(聚合被写入一个主题,然后用户规则去读取它们以使用它们),并且我必须加入流
3)要处理的每个聚合都是一个项目,每个规则都是一个项目,每个ML模型都是一个项目

优点:

  • 轻松更新。将与团队配合良好
  • 对于新手来说,简单的方法是写一些东西,而不是破坏一切
  • 看起来它可以很好地扩展-耗时的用户定义规则不会影响其他规则
缺点:

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

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

< P>你可能想考虑的一个方法是在一些缓慢变化的组件中流,而不是编译它们。例如,用户规则,甚至是聚合定义和机器学习模型。这将增加实现的复杂性,但允许在无需重新部署的情况下进行更改


这些都是这种模式的早期例子。使用广播状态,现在很容易用弗林克构建这种动态规则引擎。

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


这些都是这种模式的早期例子。使用broadcast state,现在可以更轻松地使用Flink构建这种动态规则引擎。

谢谢!非常有趣。所以它不是内置的,我必须开发这个DSL/序列化/部署。我将评估涉及的工作量。不必等待这个答案,我将用硬写的规则和加载的模型开始我的poc。关于这一点的有用链接:谢谢!非常有趣。所以它不是内置的,我必须开发这个DSL/序列化/部署。我将评估涉及的工作量。不必等待这个答案,我将用硬写的规则和加载的模型开始我的poc