作业之间的数据/事件交换

时间:2019-09-06 12:33:27

标签: apache-flink

是否可以在Apache Flink中创建一个应用程序,该应用程序由多个作业组成,这些作业构建了一个管道来处理某些数据。

例如,考虑一个具有输入/预处理阶段,业务逻辑和输出阶段的流程。 为了灵活地进行开发和(重新)部署,我想将它们作为独立的工作来运行。

在Flink中是否可以构建它并将一个作业的输出直接传递到另一个作业的输入(无需外部组件)? 如果是,我在哪里可以找到有关此文件的文档,如果其中一项作业重新启动,它可以缓冲数据吗? 如果没有,有没有人有这样的设置经验,并指出可能的解决方案?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您确实想要单独的作业,则连接它们的一种方法是通过类似Kafka的方式进行,其中作业A发布,而作业B(下游)预订。但是,一旦断开两个作业的连接,您将不再获得背压或统一检查点/保存状态的好处。

Kafka当然可以进行缓冲(最多可以存储一些最大数据量),但这并不是持久性能差异的解决方案,如果上游作业生成数据的速度快于下游作业消耗数据的速度。

我想您也可以将文件用作作业之间的“桥梁”(流式传输文件接收器,然后流式传输文件源),尽管由于下游作业必须等待上游作业决定完成,这通常会造成很大的延迟文件,然后才能使用。

答案 1 :(得分:0)

已经成功使用了很多次的替代方法是动态提供预处理和业务逻辑阶段的详细信息,而不是将它们编译到应用程序中。这意味着作业图的总体拓扑是静态的,但是您可以在作业运行时修改处理逻辑。

我已经看到了使用专用DSL,PMML模型,Javascript(通过Rhino),Groovy,Java类加载,...

您可以使用广播流来传达/更新处理的动态部分。

这是此模式的一个示例,在Flink Forward talk by Erik de Nooij from ING Bank中进行了描述。