Apache Flink 官方文档翻译之编程模型

更新时间:2017-08-10 14:04:01 点击次数:1723次

抽象层次

Flink 能够为流式计算或批处理应用提供多种层次的抽象接口。

图片描述

由于数据流 API 集成了低级处理函数,因此可以通过数据流API为某些特定操作应用低级处理接口。此外,数据集 API 也为诸如循环、迭代之类的有界数据集提供了一些补充的编程原语。

由于用户可以在数据表与数据流/数据集之间进行无缝切换,程序也可以混合使用数据表 API 和数据流/数据集 API。

程序与数据流

Flink 程序的基础构建单元是(数据)流与变换(注意,数据集 API 中使用的数据集也是一种内置的流,这一点我们以后会细说)。顾名思义,一个数据流就是一组数据记录组成的(可能永远不会停止的)流,而变换就是一种接受若干数据流作为输入,然后再输出结果数据流的过程。

Flink 程序在运行的时候会被映射到数据流图中,这个数据流图就是由程序中的数据流和相应的变换操作组成的。数据流图开始于一个或多个数据源(source),结束于另外一些汇聚点(sink)。数据流图类似于有向无环图(DAG)。虽然可以通过迭代构造器生成某些特殊形式的环,但为了简化说明,大部分情况下我们不考虑这种结构。

图片描述

通常情况下程序中的变换和数据流图中的运算符是一一对应的。不过有的时候也会出现一个变换由多个变换运算符组成的情况。

数据源和汇聚点的相关文档在数据流连接器批处理连接器的说明文档中。变换的相关文档在数据流变换数据集变换的说明文档中。

并发数据流图

本质上说,Flink 程序是分布式、并发执行的。在程序运行过程中,一个数据流可能会有一个或多个流分区,而一个运算符也可能会有一个或多个运算子任务。每个运算子任务与另外一个运算子任务之间都是相互独立的,他们是在不同的线程中运行的,甚至有可能所运行的机器或者容器都完全不同。

运算子任务的数量由运算符的并发数确定。数据流的并发数就是它所生成的运算符的个数。程序中不同的运算符可以有不同等级的并发量。

图片描述

在两个运算符之间传输数据流既可以使用一对一的直接型模式,也可以使用重分发模式:

关于配置并发的更多信息可以参阅并发执行文档。

窗口

计数(counts)、求和(sums)等聚合事件和批处理过程的工作模式完全不同。举个例子,由于数据流在理论上是无限的,因此直接计算数据流中的所有元素的个数基本上是无法实现的。因此,数据流的聚合操作(计数、求和等)都是由窗口(window)限定了范围的,例如“计算前五分钟的元素个数”,“对前100个元素求和”等。

窗口可以通过时间(例如以30秒为单位)或者数据(例如以100个元素为单位)来定义。有多种不同类型的窗口,例如数据不重叠的滚动窗口(tumbling window)、数据重叠的滑动窗口(sliding window),以及以非活动状态为间隔的会话窗口(session window)。

图片描述

这篇文章介绍了很多窗口的例子。另外,也可以查阅窗口文档了解更多内容。

时间

流式计算程序中的时间概念(例如在定义窗口时经常会用到时间)有以下几种含义:

图片描述

关于处理时间的更多信息请参阅事件时间文档

有状态操作

虽然数据流中有很多运算符每次只需要考虑当前所处理的的事件(例如事件分析器),但是仍然存在很多需要记录多个事件的信息的场景(窗口操作符就是个很好的例子),这种需要记录信息的操作就称为有状态的操作。

有状态操作的状态可以理解成是以键值对(key/value)形式储存的。这个状态的分区和分发过程是和数据流严格绑定在一起的,随后有状态运算符读取数据流就可以获取状态了。因此,在 keyBy() 函数执行之后,只能在带键的数据流中访问 key/value 状态,而且也只能获取与当前事件的主键相对应的值。数据流的键和值的对应确保了所有状态更新都是本地操作,同时也保证了事务的一致性。这个对应也使得Flink可以透明地重分发状态,并调整数据流地分区。

有关状态地更多内容请参阅有状态操作文档。

容错性检查点

Flink 通过数据重发和校验检查机制相结合的方式实现了容错能力。检查点和运算符中的相应的状态一样直接关联到输入数据流中的特定的某个点。为了维护数据一致性(一次处理的语义),可以让数据流从检查点恢复,这是通过恢复运算符的状态并对检查点对应的事件进行重发的方式实现的。

检查点区间是对程序的容错能力与恢复时间(需要重发的事件数量)的折衷。

容错区间文档中有关于Flink如何处理检查点以及其他相关主题的详细说明。更多关于配置启用检查点的资料请参阅检查点API文档

批处理操作

Flink 将批处理程序看成流式计算程序的一种有界数据流(即元素数量是可数的)的特例。这里,数据集(DataSet)也被看作一种数据流。因此,上面流式计算程序中的很多概念也能应用到批处理程序中,除了以下几处不同:

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

回到顶部
嘿,我来帮您!