Flink 提供了不一样级别的抽象,以开发流或批处理做业。 html
底层 过程函数(Process Function)与 DataStream API 相集成,使其能够对某些特定的操做进行底层的抽象。DataSet API 为有界数据集提供了额外的原语,录入循环与迭代。redis
你能够在表与 DataStream/DataSet 之间无缝切换,以容许程序将 Table API 与 DataStream 以及 DataSet 混合使用。数据库
Flink程序的基础构建模块是 流(streams) 与 转换(transformations)。(须要注意的是,Flink的DataSet API所使用的DataSets其内部也是流——更多内容将在以后讨论。)概念上来说,流是(可能永无止境的)数据记录流,而 转换 是一种操做,它取一个或多个流做为输入,并生产出一个或多个输出流做为结果。apache
执行时,Flink程序映射到 流数据流(streaming dataflows) ,由 流 以及转换 算符 构成。每个数据流起始于一个或多个 source,并终止于一个或多个 sink。数据流相似于任意的 有向无环图 (DAG) 。虽然经过 迭代 构造容许特定形式的环,可是大多数状况下,简单起见,咱们都不考虑这一点。编程
一般,程序中的转换与数据流中的操做之间是一对一的关系。有时,然而,一个转换可能由多个转换操做构成。windows
Flink程序本质上是并行分布的。在执行过程当中,一个 流 包含一个或多个 流分区 ,而每个 算符 包含一个或多个 算符子任务 。操做子任务间彼此独立,以不一样的线程执行,甚至有可能运行在不一样的机器或容器上。数据结构
算符子任务的数量即这一特定算符的 并行度 。一个流的并行度即其生产算符的并行度。相同程序中的不一样的算符可能有不一样级别的并行度。 编程语言
流在两个算符之间传输数据,能够经过 一对一 (或称 forwarding )模式,或者经过 redistributing 模式:函数
聚合事件(好比计数、求和)在流上的工做方式与批处理不一样。好比,对流中的全部元素进行计数是不可能的,由于一般流是无限的(无界的)。相反,流上的聚合须要由 窗口 来划定范围,好比 “计算过去的5分钟” ,或者 “最后100个元素的和” 。优化
窗口能够是 事件驱动的 (好比:每30秒)或者 数据驱动的 (好比:每100个元素)。窗口一般被区分为不一样的类型,好比 滚动窗口 (没有重叠), 滑动窗口 (有重叠),以及 会话窗口 (由不活动的间隙所打断)
更多窗口的案例能够查看这个博客。
当提到流程序(例如定义窗口)中的时间时,你能够参考不一样的时间概念:
更多关于如何处理时间的细节能够查看事件时间文档.
尽管数据流中的不少操做一次只查看一个独立的事件(好比事件解析器),有些操做却会记录多个事件间的信息(好比窗口算符)。 这些操做被称为 有状态的 。
有状态操做的状态保存在一个可被视做嵌入式键/值存储的部分中。状态与由有状态算符读取的流一块儿被严格地分区与分布。所以,只能访问一个 keyBy() 函数以后的 keyed streams 的键/值状态,而且仅限于与当前事件键相关联的值。对齐流和状态的键确保了全部状态更新都是本地操做,以在没有事务开销的状况下确保一致性。这种对齐还使得Flink能够透明地从新分配状态与调整流的分区。
Flink使用 流重放 与 Checkpoint 的结合实现了容错。Checkpoint与每个输入流及其相关的每个算符的状态的特定点相关联。一个流数据流能够能够从一个checkpoint恢复出来,其中经过恢复算符状态并从检查点重放事件以保持一致性(一次处理语义)
检查点间隔是以恢复时间(须要重放的事件数量)来消除执行过程当中容错的开销的一种手段。
更多关于checkpoint与容错的细节能够查看容错文档。
Flink将批处理程序做为流处理程序的特殊状况来执行,只是流是有界的(有限个元素)。 DataSet 内部被视为数据流。上述适用于流处理程序的概念一样适用于批处理程序,除了一些例外: