一、处理程序层次
Flink核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布、数据通信以及容错机制等功能。基于流执行引擎,Flink提供不同级别的抽象API来处理应用程序:
一共包含有5种API:Process Function、DataStream API 、DataSet API 、Table API 、SQL
二、数据流
Flink程序的基本构建块是stream和transformatios。从概念上讲,stream是(可能永无止境的)数据记录流,而transformation是将一个或多个流作为一个或多个流的操作输入,并产生一个或多个输出流。执行时,Flink程序映射到数据流中,包括stream和transformation。每个数据流都以一个或多个source开头,并以一个或多个sink结束。通常,程序中的转换与数据流中的运算符之间存在一对一的对应关系。但是,有时一个转换可能包含多个转换运算符。
三、数据流并行
Flink中的程序本质上是并行和分布式的。在执行期间,stream具有一个或多个流分区,并且每个operator具有一个或多个operator subtasks。operator subtasks彼此独立,并且可以在不同的线程中执行,并且可能在不同的机器上执行。operator subtasks的数量是该特定operator 的并行度。stream的并行性始终是其生成operator的并行性。同一程序的不同operator可能具有不同的并行级别。
stream可以以一对一(或转发)模式或以重新分发模式传输数据:
-
一对一:(例如,在上图中的Source和map()运算符之间)保留元素的分区和排序。
-
重新分配:(在上面的map()和keyBy / window之间,以及 keyBy / window和Sink之间)重新分配流。每个运算符子任务将数据发送到不同的目标子任务,具体取决于所选的transformation。
四、窗口模式
聚合事件(例如,计数,总和)在stream上的工作方式与batch处理方式不同。例如,不可能计算stream中的所有元素,因为流通常是无限的(无界)。相反,流上的聚合(计数,总和等)由windows限定,例如“在最后5分钟内计数”或“最后100个元素的总和”。Windows可以是时间驱动的(例如:每30秒)或数据驱动(例如:每100个元素)。
五、时间
Flink支持3种类型的时间窗口,分别适用于用户对于时间窗口不同类型的要求:
Event Time:消息自带时间戳,根据消息的时间戳进行处理,确保时间戳在同一个时间窗口的所有消息一定会被正确处理。
Ingress Time:消息进入到Flink数据流种的时间
Operator Time:Task所在的节点信息处理时间
六、容错机制
Flink使用重新发送数据和checkpoint的组合实现容错。checkpoint与每个输入stream中的特定点以及每个operator的对应状态相关。通过恢复operator的状态并从checkpoint处重新发送数据,可以从checkpoint处恢复流数据流,同时保持一致性(恰好一次处理语义)