Flink 的编程模型
in Note with 0 comment
Flink 的编程模型
in Note with 0 comment

在计算机领域,很多时候,我们学习新工具,第一个学习内容就是官方文档。按着官方学习推荐路线走准没错的。

学习使用 Flink 第一步,官方推荐我们要了解一些基本概念,特别是 Dataflow Programming Model (数据流编程模型)和 Distributed Runtime Environment(分布式执行环境)

1547194248106-9258f0f2-c081-4366-b149-883352ed1bed-image-resized.png

这两个概念太重要了,将会分两篇文章来,现在这篇文章将会重点介绍 Flink 的编程模型。


抽象层次

Flink提供不同级别的抽象来开发流/批处理应用程序。

1547196327488-6dceb9eb-9519-4720-ae30-193d6e0a212e-image-resized.png

程序和数据流

用户实现的Flink程序是由 Stream 和 Transformation 这两个基本构建块组成,其中Stream 是一个中间结果数据,而 Transformation 是一个操作,它对一个或多个输入Stream 进行计算处理,输出一个或多个结果 Stream。当一个 Flink 程序被执行的时候,它会被映射为 Streaming Dataflow。一个 Streaming Dataflow 是由一组 Stream 和Transformation Operator (算子)组成,它类似于一个 DAG 图,在启动的时候从一个或多个Source Operator 开始,结束于一个或多个 Sink Operator。

1547200725173-9847159f-a510-4ad4-bf67-683dbf1d6123-image.png

上图中,FlinkKafkaConsumer 是一个 Source Operator,而 map、keyBy、timeWindow、apply 是 Transformation Operator,同时 RollingSink 是一个Sink Operator。

并行数据流

在 Flink 中,程序天生是并行和分布式的:一个 Stream 可以被分成多个 Stream 分区(Stream Partitions),一个 Operator 可以被分成多个 Operator Subtask,每一个Operator Subtask 是在不同的线程中独立执行的。一个 Operator 的并行度,等于Operator Subtask 的个数,一个 Stream 的并行度总是等于生成它的 Operator 的并行度。有关 Parallel Dataflow 的实例,如下图所示:

1547201308390-93df1229-0570-4a40-aee8-4f7ad7859f3f-image.png

上图 Streaming Dataflow 的并行视图中,展现了在两个 Operator 之间的 Stream 的两种模式:

Windows (窗口)

聚合事件(例如,计数,总和)在流上的工作方式与批处理方式不同。例如,不可能计算流中的所有数据元,因为流通常是无限的(无界)。所以流上的聚合(计数,总和等)由窗口限定,例如“在最后5分钟内计数”或“最后100个数据元的总和”。

Windows 可以是时间驱动的(例如:每30秒)或数据驱动(例如:每100个数据元)。一个典型地区分不同类型的窗口,例如翻滚窗口(没有重叠), 滑动窗口(具有重叠)和会话窗口(由不活动的间隙打断)。

1547201886425-6fca0db0-ba17-4488-9932-6d6b8db7626e-image.png

Time(时间)

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

1547202720882-6eb06286-eb83-4a70-9571-0398ea53a4fc-image.png

Stateful Operations(有状态的算子操作)

在流处理中,有些操作仅仅在某一时间针对单一事件(如事件转换map),有些操作需要记住多个事件的信息并进行处理(window operators),后者的这些操作称为有状态的操作。

有状态的操作一般被维护在内置的 key/value 存储中。这些状态信息会跟数据流一起分区并且分布存储,并且可以通过有状态的数据操作来访问。因此这些 key/value 的状态信息仅在带 key 的数据流(通过 keyBy() 函数处理过)中才能访问到。数据流按照key排列能保证所有的状态更新都是本地操作,保证一致性且无事务问题。同时这种排列方式使Flink能够透明的再分发状态信息和调整数据流分区。

1547475974648-c0334efa-516c-452c-b99d-d2dee37b255a-image.png

Checkpoints for Fault Tolerance(容错检查点)

Flink 通过流回放和设置检查点的方式实现容错。一个 checkpoint 关联了输入流中的某个记录和相应状态和操作。数据流可以从 checkpoint 中进行恢复,并保证一致性(exactly-once 的处理语义)。 Checkpoint 的间隔关系到执行是的容错性和恢复时间。

流上的批处理

Flink 把批处理作为特殊的流处理程序来执行,许多概念也都可以应用的批处理中,除了一些小的不同:


👊 结束。

Responses