flink

Dataflow Programming Model

2018-01-20  本文已影响23人  小C菜鸟

原文地址


抽象层级

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


程序与数据流

Flink程序的基本构建块是流和转换。(注意,Flink的DataSet API使用的DataSet在内部也是流——详见后述)概念上流是数据记录(可能是永无休止的)的流动,转换是一个操作,它将一个或多个流作为输入,并且产生一个或多个流作为结果。
当执行时,Flink程序被映射到数据流上,它由流和转换操作组成。每个数据流从一个或多个源开始,以一个或多个sink结束。数据流类似有向无环图(DAG)。尽管通过迭代可以构建特殊形式的循环,但是在大多数情况下,我们会为了简单而忽略它。


通常程序中的转换和数据流上的操作是一一对应的。然而有些时候一个转换可能由多个转换操作组成。
Source和Sink记录在流连接器批处理连接器文档中。转换记录在DataStream操作DataSet转换文档中。

并行数据流

Flink程序本质上是并行的和分布式的。在执行期间,一条流有一个或多个流分区,并且每个操作有一个或多个操作子任务。操作子任务间彼此独立,可能在不同的线程,机器或者容器中执行。
操作子任务梳理就是特定操作的并行度。流的并行度通常是它上的操作的并行度。同一个程序的不同操作可能有不同级别的并行度。


流可以在一对一(或转发)模式之间传输数据,也可以在重新分配模式中传输数据:

窗口

聚合事件(例如,计数,求和)在流中工作方式不同于批处理。例如,不可能计算流中的所有元素,因为流通常是无限的(无界的)。相反,流上聚合(计数,求和等)由窗口覆盖,例如“计数最后5分钟”,或者“对最后100个元素求和”。
窗口可以是时间驱动的(例如,每30秒)或者数据驱动(例如,每100个元素)。一个典型的区别是不同类型的窗口,例如滚动窗口(没有重叠),滑动窗口(有重叠),和会话窗口(中间有一个不活动的间隙)。


更多的窗口例子可以在这篇博文中找到。更多的细节在窗口文档中。
More window examples can be found in this blog post. More details are in the window docs.

时间

当提到流媒体程序中的时间(例如定义windows)时,可以引用不同的时间概念:

如何处理时间的细节在事件时间文档中。

有状态的操作

虽然数据流上的很多操作在某个时刻只是简单的关注一个事件(例如事件解析器),但是一些操作记录跨多个事件的信息(例如窗口操作)。这些操作称为有状态的。
有状态操作的状态维护在嵌入式的key/value存储中。状态被分区并且与有状态操作符读取的流严格地分布在一起。因此在keyBy()函数后,访问key/value状态只能在key相关的流中,仅限于与当前事件的key相关的value。对齐流的key和状态使得所有的状态更新都是本地操作,确保一致性没有事务开销。这一对齐也允许Flink重新分配状态,并透明的调整流分区。


更多的细节,参见状态文档。

容错机制的检查点

Flink使用流回放检查点组合来实现容错。检查点与每个输入流中的特定点以及每个操作符对应的状态相关。通过恢复操作符的状态,并从检查点的点重新播放事件,可以从检查点恢复流数据流,同时保持一致性(精确一次的处理语义)。
检查点的间隔意味着执行期间发生容错,恢复过来的时间开销(需要重新播放的事件数量)。
内部容错的提供了更多Flink如何管理检查点和相关主题的更多信息。关于如何开启和配置检查点的细节在检查点API文档中。

流批量处理

Flink执行批处理当做一个流式程序的一个特例,即流是有界的(有限数量的元素)。一个DataSet内部被当做一个数据流。上面的概念既适用于批处理程序,也适用于流处理程序,除了一些例外:

上一篇下一篇

猜你喜欢

热点阅读