Flink编程模型

Flink抽象的层次

Flink为流式计算和批处理计算编程提供了不同层次的抽象。
这里写图片描述

最底层的抽象仅仅提供有状态的流处理,通过Process Function嵌入到DataStream API中。开发者可以处理来自多个数据流的事件,使用Flink提供的容错机制,此外也允许开发者注册事件时间和处理时间回调,以便实现复杂的计算逻辑。

事实上大部分程序并不会直接使用Statefull Stream Processing层提供功能,而是直接使用Flink提供的Core API。Flink提供的Core API包括用于处理流数据的DataStream API和用于处理批数据的DataSet API。Core API提供了用户进行流数据处理所需的大部分功能,包括数据的transform、join、aggregation操作。底层的Process Function和DataStream API的集成使得可以在特定算子使用底层的功能。DataSet API针对有界数据集额外提供了一些原语,比如loops和iterations。

Table API是围绕Table提供的领域描述语言(DSL)。Table API遵循关系模型,Table都有自己的Schema,API提供关系模型中类型的操作。包括select、project、join、groupBy和聚合。Table API程序侧重于描述进行何种操作,而不是通过代码如何实现指定的操作。虽然Table API可以通过各种用户定义的函数进行扩展,但是并没有Core API那么强的表述能力,但是Table API却更便于用户使用。Table API程序在执行之前是经过优化程序优化处理,用户可以无缝的在Table API和DataStream/DataSet API间切换,允许程序同时混合Table API和DataStream/DataSet API。

Flink提供的最高层次的抽象是SQL,该层次抽象在语法和表述方面与Table API类似。

Flink程序和数据流

Flink程序由stream和transformation构成。数据记录的流动形成了stream,transformation是对数据的操作,接受多个stream作为输入,产生一个或则多个输出stream作为结果。Flink程序执行时将被映射成streaming dataflows,streaming dataflows由streams和组成transformation的算子构成。dataflow起始于一个或则多个source,终止于一个或则多个sink。

这里写图片描述

通常程序中的 transformation和dataflow中的算子是一一对应关系,但是有时一个transformation也可以对应dataflow中的多个算子。

并行数据流

Flink程序天然支持并行和分布式计算。在程序执行时,stream对应多个stream partition,每个算子(operator)对应多个子任务(subtask)。算子的各个子任务之间相互独立,子任务分配到不同的线程或则容器中执行。

子任务的数量就是算子的并行度,stream的并行度指的是producing算子的并行度。同一个程序中各个算子的并行度可以是不一样的。

这里写图片描述

streams可以在两个算子之间以one-to-one或则redistributing模式传递数据。

  • one-to-one模式

  • redistributing模式

窗口概念

Batch程序和Stream程序事件的聚合操作是不一样的。比如我们无法对unbound stream中的元素个数进行count计算,所以针对unbound stream元素聚合操作都限定在指定的窗口内。窗口可以是基于时间的(例如30分钟内)也可以是基于数据的(例如100个元素)。

这里写图片描述

时间相关

在Flink的Stream程序中需要区分以下几个关于时间的不同概念:

  • Event Time
    Event Time指的是事件产生的时间,使用时间戳记录事件发生的时间。

  • Ingestion Time
    Ingestion Time指的是事件进入dataflow中源算子(source operator)的时间。

  • Processing Time
    Processing Time是指算子执行基于时间操作的的本地时间。

这里写图片描述

Fault tolerance

Flink的容错是通过定时的执行checkpoint(检查点)操作和stream replay(流重放)操作实现的。Flink在程序执行期间定时执行checkpoint操作,记录该时刻stream的事件和算子的状态。在故障恢复时根据特定checkpoint保存的snapshot,replay各个stream的事件和恢复各个算子故障前的状态。

Batch程序

在Flink内部Batch程序被当成一个特殊的Stream程序来处理,Batch程序的特别之处在于该程序的数据流的数据是有限的。DataSet在Flink内部也是被当成一个数据流处理。上文中针对Stream程序提到的概念同样适用于Batch程序,Batch程序和Stream程序的不同点在于:

  • Batch程序的容错机制
    Batch程序的容错不是依赖类似于Stream程序的checkpoint机制。由于Batch程序的数据是有限的,所以在故障恢复的时候可以replay所有的stream的数据。Batch程序的这种容错机制避免了在正常的数据处理过程中进行checkpoint操作,减轻了数据处理的负担。

  • DataSet API中的带状态操作
    Batch程序中带状态的操作使用比较简单的in-memory/out-of-core数据结构而不是key/value索引存储状态。

  • DataSet API引入了同步迭代器
    同步Iteration只能在有限的数据流中使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值