flink针对 流式/批处理 应用提供了不同的抽象级别。
Flink程序的基本构建模块是streams(流)和transformations(转换)。(需要注意的是,flink的dataSet API所使用的DataSets内部也是流-更多内容将在以后解释)。从概念上讲流(可能没有结束)是一个数据流记录,而转换是一个操作,它取一种或者多种流作为输入,并产生一个或者多个输出流作为结果。
当执行的时候,flink程序映射到streaming dataflows(流数据流),由streams和转换operators组成。每一个数据流开始于一个或者多个source,并且终止于一个或者多个sink。数据流类似于任意的 有向无环图(DAGS)。虽然通过迭代构造运行特定形式的环,但是大多数情况下,简单起见,我们都不考虑这一点。
通常情况下,程序中的转换与数据流中的操作是一一对应的。有时,然而,一个转换可能有多个转换操作构成。
source和sink的文档在streaming connectors 和 batch connectors 。transformation的文档在dataStream operators和dataSet transformation。
Flink程序本质上是并行的和分布式的。在执行过程中,一个流(stream)包含一个或多个流分区 ,而每一个operator包含一个或多个operator子任务 。操作子任务间彼此独立,以不同的线程执行,甚至有可能运行在不同的机器或容器上。
operator子任务的数量即这一特定operator的并行度 。一个流的并行度即其生产operator的并行度。相同程序中的不同的operator可能有不同级别的并行度。
流在两个operator之间传输数据,可以通过一对一(或称 forwarding )模式,或者通过redistributing模式:
配置和并行度的详细配置可以查看这个文档parallel execution。
聚合事件(比如计数、求和)在流上的工作方式与批处理不同。比如,对流中的所有元素进行计数是不可能的,因为通常流是无限的(无界的)。相反,流上的聚合需要由 窗口 来划定范围,比如 “计算过去的5分钟” ,或者 “最后100个元素的和” 。
窗口可以是 事件驱动的 (比如:每30秒)或者 数据驱动的 (比如:每100个元素)。窗口通常被区分为不同的类型,比如 滚动窗口 (没有重叠), 滑动窗口 (有重叠),以及 会话窗口 (由不活动的间隙所打断)
更多的窗口例子可以查看这个博客。更多的明细可以查看窗口文档window docs。
当提到流程序(例如定义窗口)中的时间时,你可以参考不同的时间概念:
操作时间的更多详细信息请查看文档event time docs。
尽管数据流中的很多操作一次只查看一个独立的事件(比如事件解析器),有些操作却会记录多个事件间的信息(比如窗口算符)。 这些操作被称为 有状态的 。
有状态操作的状态保存在一个可被视作嵌入式键/值存储的部分中。状态由有状态operator读取的流一起被严格地分区与分布。因此,只能访问一个 keyBy() 函数之后的 keyed streams 的键/值状态,并且仅限于与当前事件键相关联的值。调整流和状态的键确保了所有状态更新都是本地操作,以在没有事务开销的情况下确保一致性。这种对齐还使得Flink可以透明地重新分配状态与调整流的分区。
查看更多信息,请查看此文档有关state的内容。
Flink使用 流重放 与 检查点 的结合实现了容错。检查点与每一个输入流及其相关的每一个算符的状态的特定点相关联。一个数据流可以从一个检查点恢复出来,其中通过恢复operator状态并从检查点重放事件以保持一致性 (一次处理语义)
检查点间隔是以恢复时间(需要重放的事件数量)来消除执行过程中容错的开销的一种手段
容错内部的描述提供了更多关于flink管理检查点和相关的话题。启用和配置检查点的详细信息请查看这个文档checkpointing API docs。
Flink将批处理程序作为流处理程序的特殊情况来执行,只是流是有界的(有限个元素)。 DataSet 内部被视为数据流。上述适用于流处理程序的概念同样适用于批处理程序,除了一些例外:
继续学习Flink的分布式运行时的基本概念
Flink入门及实战-上:
http://edu.51cto.com/sd/07245
Flink入门及实战-下:
http://edu.51cto.com/sd/5845e
获取更多大数据资料,视频以及技术交流请加群: