1、流式处理的背景

传统的大数据处理方式一般是批处理式的,也就是说,今天所收集的数据,我们明天再把今天收集到的数据算出来,以供大家使用,但是在很多情况下(监控、链路分析),数据的时效性对于业务的成败是非常关键的。

现如今流式处理的基本框架,如下。




flink upsert 流式读取 flink流式处理的原理_API


主要分为六个部分:事件生产者、收集、排队系统(kafka,在数据高峰时,暂时把它缓存,防止数据丢失。)、数据变换(流式处理过程)、长期存储、陈述/行动。

流式处理的框架评价指标:


flink upsert 流式读取 flink流式处理的原理_flink upsert 流式读取_02


【说明】

【数据传输的保障度】是指能不能保证数据被处理并到达目的地。目前有三种可能性:保证至少一次、最多一次、精确一次。大多数情况下,“保证至少一次”就能满足业务要求,除要求数据精确度高的特定场景。

【处理延迟】在大多数情况下,流式处理的延迟越低越好,但很多情况下,我们的延迟越低,相应付出的代价也越高,“吞吐量”与“处理延迟”就是一对矛盾。吞吐量高,相应的延迟就会低,吞吐量低,相应的延迟就会高。

【状态管理】我们在实时变换的过程中,要有与外部的交互,如入侵检测,以此来保护环境和数据的安全。

【容错能力和容错负荷】要求当流式处理在正常进行中,即使有某些机器挂掉,系统仍能正常运行,整个流式处理框架不受影响。

【流控】也就是流量控制,我们在数据传输的过程中,可能会数据突然增多,为了保证系统不至于负荷过重而崩溃,这时候就需要控制数据密度。

【编程复杂性】相对而言,API设计地越高级,编程负担越低。

2、Flink 原理

Flink的整个组件类似于Spark,它的核心是一个分布式的流式处理框架,在核心之上,有两套API,一套应用于批处理—DataSet API,一套应用于流式处理—DataStream API。


flink upsert 流式读取 flink流式处理的原理_数据_03


从图中我们可以看到,在两套API下又有更为高级的库(Distributed Streaming Dataflow),而它的整个处理部署方式可以支持本地、集群、云端。

  • Flink的整个架构和Spark很相似,有三个主要部分。


flink upsert 流式读取 flink流式处理的原理_connect flink_04


一个是提交任务的客户端—Flink Program;还有作业的管理器—JobManager,主要负责任务的调度和状态的检测,以及在整个集群出现故障时进行初步管理;最后是任务管理器—TaskManager,实现业务逻辑的执行,负责把接受到的任务运行之后,将相应的结果输出到外部或进行外部交互。在整个过程中,JobManager是不负责任务执行的。

  • Flink的具体编程模型结构:


flink upsert 流式读取 flink流式处理的原理_flink upsert 流式读取_05


flink upsert 流式读取 flink流式处理的原理_flink upsert 流式读取_06


  • flink的transformation操作:

【map】就是做一些映射,比如我们把两个字符串合并成一个字符串,把一个字符串拆成两个或者三个字符串。

【flatMap】类似于把一个记录拆分成两条、三条、甚至是四条记录。

【Filter】就类似于过滤。

【keyBy】就等效于SQL里的group by。

【reduce】就类似于MapReduce里的reduce。

【join】操作就有点类似于我们数据库里面的join。

【aggregate】是一个聚合操作,如计数、求和、求平均等。

【connect】实现把两个流连成一个流。

【repartition】是一个重新分区操作。

  • Flink的执行机制:


flink upsert 流式读取 flink流式处理的原理_数据_07


上图是表现业务逻辑的业务执行图,Flink的执行方式类似于管道,它借鉴了数据库的一些执行原理,实现了自己独特的执行方式。

  • Flink的容错机制


flink upsert 流式读取 flink流式处理的原理_字符串_08


Flink在处理数据流时,它的整个数据流里面的数据分为两种,一种是本身业务发给的数据,还有一种是Flink自己插到数据流里面的数据。插入的记录我们叫它barrier,就是栅栏,我们可以把它看成一个表示进度的标记,标记整个数据处理的状态,它从源头发出。从图中我们可以看到,不管是什么流,它都会产生一个checkpoint barrier。


flink upsert 流式读取 flink流式处理的原理_connect flink_09


当operator收到栅栏之后,它会把栅栏的状态存储,然后把特定记录发出去,到达第二个operator里面,它又把它的状态放到Master里,它就是这样一步一步去完成的。在这个过程中,如果有一步出现故障,Flink会重复前面的步骤,重新去运行,所以不会出现数据的丢失和错误。

3、Flink的实践:


flink upsert 流式读取 flink流式处理的原理_connect flink_10


参考网站:

https://ci.apache.org/projects/flink/flink-docs-release-1.6/internals/stream_checkpointing.html