从高层次上讲,我们可以将流处理中的状态视为算子中的内存,在内存中记录有关过去输入的信息,并可以作用于将来输入的处理。相反,无状态流处理中的算子仅关注当前输入,不关注上下文以及过去的输入。用一个简单的示例来说明这种差异:假设我们有一个数据流,事件格式为{event_id:int,event_value:int}。我们的目标是提取每个事件的 event_value 并输出。我们可以通过简单的 source-map-sink 管道轻松实现,其中 map 函数从事件中提取 event_value 并将其发送到下游的 Sink。这是一个无状态流处理的实例。如果我们仅在当前事件的 event_value 大于上一个事件时才输出,这该怎么办?在这种情况下,我们的 map 函数显然需要某种方式来记住上一个事件的 event_value,因此这是一个有状态流处理的实例。
2. 状态Apache Flink 是一个大规模并行分布式处理系统,可以进行大规模的有状态流处理。为了实现扩展性,Flink 作业在逻辑上分解为算子图,并且每个算子在物理执行上分解为多个并行算子实例。从概念上讲,Flink 中的每个并行算子实例都是一个独立的任务,可以在自己的机器上进行调度(Shared-Nothing 架构有网络连接的集群中)。
为了实现高吞吐量和低延迟,必须最小化任务之间的网络通信。在 Flink 中,用于流处理的网络通信仅发生在作业算子图中的相邻边&#