Flink 提供了不同的抽象级别来开发流式或批处理应用

最底层级的抽象仅仅提供了有状态流。它将通过过程函数(Process Function)嵌入到DataStream API,过程函数(ProcessFunction) 可以被认为一种提供了对有键状态(keyed state)和定时器(timers)访问的 FlatMapFunction

大多数应用并不需要上述的低层级抽象,而是针对 核心API(Core APIs) 进行编程,比如DataStream API(有界或无界流数据)以及DataSet API(有界数据集)

比如由用户定义的多种形式的转换(transformations),连接(joins),聚合(aggregations),窗口操作(windows),状态(state)等等

Flink程序的基础构建模块是 流(streams) 与 转换(transformations)

执行时,Flink程序映射到 流数据流(streaming dataflows) ,由  以及转换 算符 构成。每一个数据流起始于一个或多个 source,并终止于一个或多个 sink

通常,程序中的转换与数据流中的操作之间是一对一的关系。有时,然而,一个转换可能由多个转换操作构成。

Flink程序本质上是并行分布的。在执行过程中,一个  包含一个或多个 流分区 ,而每一个 算符 包含一个或多个 算符子任务 。操作子任务间彼此独立,以不同的线程执行,甚至有可能运行在不同的机器或容器上。

聚合事件(比如计数、求和)在流上的工作方式与批处理不同。比如,对流中的所有元素进行计数是不可能的,因为通常流是无限的(无界的)。相反,流上的聚合需要由 窗口 来划定范围,比如 “计算过去的5分钟” ,或者 “最后100个元素的和” 。

窗口可以是 事件驱动的 (比如:每30秒)或者 数据驱动的 (比如:每100个元素)。窗口通常被区分为不同的类型,比如 滚动窗口 (没有重叠), 滑动窗口 (有重叠),以及 会话窗口 (由不活动的间隙所打断)

时间

当提到流程序(例如定义窗口)中的时间时,你可以参考不同的时间概念:

  • 事件时间 是事件创建的时间。它通常由事件中的时间戳描述,例如附接在生产传感器,或者生产服务。Flink通过时间戳分配器访问事件时间戳。
  • 摄入时间 是事件进入Flink数据流源算符的时间。
  • 处理事件 是每一个执行时间操作的算符的本地时间。