Flink 官方文档跟读 -- Try Flink -- OverView
前言:
学习框架的最好方式就是跟读官方文档,对于Flink的框架的特性与功能,参照官网文档,进行一个系统的跟读与总结。提炼重点,发表一些观点。
注:参照文档:flink-docs-release-1.11,文章题目 "--" 后的内容为官网对应专题,官方文档直译部分加粗
本章(Try Flink)教程的目标及涵盖范围(本章教程的目标及涵盖范围)
你将在本章学习到以下内容:
- 如何实现流数据处理管道(pipelines)
- Flink 如何管理状态以及为何需要管理状态
- 如何使用事件时间(event time)来一致并准确地进行计算分析
- 如何在源源不断的数据流上构建事件驱动的应用程序
- Flink 如何提供具有精确一次(exactly-once)计算语义的可容错、有状态流处理
总结:flink为一个多并行度(parallel)且有状态(stateful)的流式-数据(streaming dataflows)处理框架,由一到多个数据源(source)经过不同的(operators)的转换(transform)得到一至多个“汇”(sink)
Stream Processing(流处理)
数据流分类(Stream):
在自然环境中,数据的产生原本就是流式的。无论是来自 Web 服务器的事件数据,证券交易所的交易数据,还是来自工厂车间机器上的传感器数据,其数据都是流式的。但是当你分析数据时,可以围绕 有界流(bounded)或 无界流(unbounded)两种模型来组织处理数据,当然,选择不同的模型,程序的执行和处理方式也都会不同。
flink是流处理框架,可以按照数据集的数据量区分为流处理或批处理
批处理:有限数据集有限选用批处理 (bounded)
流处理:源源不断数据产生时采用流处理(unbounded)
组件抽象:
在 Flink 中,应用程序由用户自定义算子(operator)转换而来的Streaming dataflows 所组成。这些流式 dataflows 形成了有向图,以一个或多个源(source)开始,并以一个或多个汇(sink)结束。
Parallel Dataflows(并行数据流)
Flink 程序本质上是分布式并行程序。在程序执行期间,一个流有一个或多个流分区(Stream Partition),每个算子有一个或多个算子子任务(Operator Subtask)。每个子任务彼此独立,并在不同的线程中运行,或在不同的计算机或容器中运行。
算子子任务数就是其对应算子的并行度。在同一程序中,不同算子也可能具有不同的并行度。
总结:每一个黄色的圆圈都代表一个(operator)每个算子会有不同的子任务(subtask),一个operator的并行度(parallel)为当前subtask的个数
Flink 算子之间可以通过一对一(直传)模式或重新分发模式传输数据:
-
一对一模式 即同一分区的数据只会进入到下游算子的同一分区。
-
重新分发模式则会更改数据所在的流分区。当你在程序中选择使用不同的 transformation,每个算子子任务也会根据不同的 transformation 将数据发送到不同的目标子任务。例如以下这几种 transformation 和其对应分发数据的模式:keyBy()(通过散列键重新分区)、broadcast()(广播)或 rebalance()(随机重新分发)。在重新分发数据的过程中,元素只有在每对输出和输入子任务之间才能保留其之间的顺序信息。因此,不同键(key)的聚合结果到达 Sink 的顺序是不确定的。
Timely Stream Processing(自定义时间流处理)
对于大多数流数据处理应用程序而言,能够使用处理实时数据的代码重新处理历史数据并产生确定并一致的结果非常有价值。
在处理流式数据时,我们通常更需要关注事件本身发生的顺序而不是事件被传输以及处理的顺序,因为这能够帮助我们推理出一组事件(事件集合)是何时发生以及结束的。例如电子商务交易或金融交易中涉及到的事件集合。
为了满足上述这类的实时流处理场景,我们通常会使用记录在数据流中的事件时间的时间戳,而不是处理数据的机器时钟的时间戳。
总结:stream 支持基于处理时间(processing time) 和事件发生时间(event time)
Stateful Stream Processing(有状态流处理)
状态始终在本地访问,这有助于Flink应用程序实现高吞吐量和低延迟。 您可以选择将状态保留在JVM堆上,或者如果状态太大,则保留在有效组织的磁盘数据结构中。
总结:flink 基于key或者operator保存状态,state在memory或disk上,并且定期更新到持久存储中
关于flink状态:https://blog.****.net/h8b6Pk7M7r8/article/details/100012397
Fault Tolerance via State Snapshots
通过状态快照和流重放两种方式的组合,Flink 能够提供可容错的,精确一次计算的语义。这些状态快照在执行时会获取并存储分布式 pipeline 中整体的状态,它会将数据源中消费数据的偏移量记录下来,并将整个 job graph 中算子获取到该数据(记录的偏移量对应的数据)时的状态记录并存储下来。当发生故障时,Flink 作业会恢复上次存储的状态,重置数据源从状态中记录的上次消费的偏移量开始重新进行消费处理。而且状态快照在执行时会异步获取状态并存储,并不会阻塞正在进行的数据处理逻辑
总结:flink通过快照和流重放实现 精准一次性,并且恢复数据的过程是对用户无感知的