用于消息传递的Flink有状态功能地址解析

问题描述

在Flink数据流中,假设上游操作员托管在计算机/任务管理器m上,上游操作员如何知道托管下游操作员的计算机(任务管理器)m’。在JobManager对作业子/任务(操作员)进行初始调度期间,是否在下游/上游操作员之间建立了这样的数据流路径,并且在应用程序的生命周期中固定了此类数据流路径?

更一般地说,考虑Flink有状态功能,其中支持动态消息传递并且数据流不固定或未预定义,并且给定具有键k功能,该功能需要将消息/事件发送到具有键{的另一个功能{1}}函数k’将如何找到函数k的地址以进行消息传递? Flink运行时是否将密钥机器映射保留在某些分布式数据结构中(例如Microsoft Orleans中的DHT),并且每次调用函数都涉及对这种数据结构的访问?

请注意,我来自Spark的背景,在给定RDD /批处理模型的情况下,作业图任务连续执行(在随机播放边界处中断),每个随机播放子任务都被指示持有应拉出的键子集的机器的指令/由该子任务处理...。

谢谢。

解决方法

即使具有状态功能,底层Flink作业的拓扑在启动作业时也是固定的。每个有状态函数作业或多或少都使用一个这样的作业图(入口有所不同,但是其余的总是这样):

enter image description here

在这里,您看到所有已加载的入口都成为Flink源运算符,发出输入消息, 路由器成为链接到这些源的平面图操作员。

用作路由器的平面图将输入消息转换为内部事件信封, 本质上,只需将消息有效负载及其目标逻辑地址包装在一起即可。信封是 流图流中所有消息的在线数据类型。 有状态函数运行时以函数调度程序运算符为中心, 在所有模块中运行所有已加载函数的实例。

在路由器平面图运算符和功能调度程序运算符之间是keyBy操作 它将使用目标目标id作为键重新划分输入流。这个 网络随机播放可确保将用于给定id的所有消息发送到同一个 函数分派运算符的实例。

在收到时,功能分派器从信封中提取目标功能地址,并加载 该函数实例,然后使用包装的输入(也位于 信封)。

函数分派器的不同实例如何相互发送消息?

这是通过将每个函数分派器与 feedback运算符共同定位来完成的。 使用目标函数id作为键,所有传出消息都会通过另一个网络随机播放。

此反馈运算符在作业图中创建一个循环或 iteration 。有状态功能的消息传递模式可以具有循环或循环,而不仅限于使用DAG处理数据。

反馈频道已检查点;消息一旦失败就不会丢失。

有关此内容的更多信息,我建议Tzu-Li(Gordon)Tai进行的“ Flink Forward”演讲:Stateful Functions: Polyglot Event-Driven Functions for Stateful Distributed Applications。上图来自他的演讲。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...