Apache flink 如何使用单个Flink应用程序提交多个Flink作业

Apache flink 如何使用单个Flink应用程序提交多个Flink作业,apache-flink,flink-streaming,Apache Flink,Flink Streaming,假设我有一个Flink应用程序来过滤、转换和处理流 如何将此应用程序分为两个作业,并在不使用间歇存储的情况下与它们进行通信 有关数据流,请参阅下图 用例的原因: 事件大小:2KB, 事件精简版:200B, TPS:1M 为了有效利用Java堆在任何给定时间存储更多事件,需要进行转换。 在单个TaskManager上执行所有这三项操作的缺点是也存储摄取的事件,其中近80%的事件是不需要的 在不同的任务管理器上运行这些作业将为扩展处理功能提供极大的灵活性 如果您需要帮助,欢迎提出任何建议。还试图了解

假设我有一个Flink应用程序来过滤、转换和处理流

如何将此应用程序分为两个作业,并在不使用间歇存储的情况下与它们进行通信

有关数据流,请参阅下图

用例的原因:

事件大小:2KB, 事件精简版:200B, TPS:1M

为了有效利用Java堆在任何给定时间存储更多事件,需要进行转换。 在单个TaskManager上执行所有这三项操作的缺点是也存储摄取的事件,其中近80%的事件是不需要的

在不同的任务管理器上运行这些作业将为扩展处理功能提供极大的灵活性

如果您需要帮助,欢迎提出任何建议。还试图了解如何通过一个Flink应用程序提交多个作业

有几点:

Flink 1.11中引入的,允许一个
main()
方法提交多个作业,但这些作业之间没有直接通信的机制。Flink通过快照实现容错的方法并没有扩展到管理多个作业中的状态

假设您可以将作业与套接字接收器和套接字源连接起来。但如果这样做,您将放弃容错

通过配置一个插槽共享组,强制管道的最后一个阶段进入它们自己的插槽,您可以实现与您所要求的类似的功能。然而,这几乎肯定是一个坏主意,因为它将强制执行可能不必要的ser/de,并导致资源利用率降低。但它会将这些管道阶段分离到另一个JVM中

如果目标是拥有可单独部署和可独立扩展的组件,则可以通过使用的远程功能来实现


为了最大限度地提高ETL作业的性能(并最大限度地减少垃圾收集),您最好利用操作员链接和对象重用,并将所有内容都保存在一个作业中。

您能更详细地解释动机吗?我不明白为什么任何事件都会存储在任务管理器中,如果它们只是被转换和过滤的话。M1:找到如何分割作业以使TM具有更少的GC。M2:了解如何在单个应用程序中部署多个Flink作业,即在应用程序模式下部署。这是一个流式作业,我假设运营商链接在这里也会带来同样的好处。是否建议进行多个作业部署,在b/w中使用一些msg系统,在操作员处使用不同的并行性进行转换?操作链和对象重用(默认情况下为关闭)协同工作,以优化批处理和流式作业中的通信。任何强制序列化/反序列化和网络通信的操作都是昂贵的——包括keyBy、并行性更改或使用多个作业。源操作符将具有操作符状态,对吗?这将使源偏移量和到目前为止已侦听且尚未传递的事件保持正确?具有运算符链接有助于减少相同的多个运算符状态。我的理解正确吗?