1、流式处理的背景
传统的大数据处理方式一般是批处理式的,也就是说,今天所收集的数据,我们明天再把今天收集到的数据算出来,以供大家使用,但是在很多情况下(监控、链路分析),数据的时效性对于业务的成败是非常关键的。
现如今流式处理的基本框架,如下。
主要分为六个部分:事件生产者、收集、排队系统(kafka,在数据高峰时,暂时把它缓存,防止数据丢失。)、数据变换(流式处理过程)、长期存储、陈述/行动。
流式处理的框架评价指标:
【说明】
【数据传输的保障度】是指能不能保证数据被处理并到达目的地。目前有三种可能性:保证至少一次、最多一次、精确一次。大多数情况下,“保证至少一次”就能满足业务要求,除要求数据精确度高的特定场景。
【处理延迟】在大多数情况下,流式处理的延迟越低越好,但很多情况下,我们的延迟越低,相应付出的代价也越高,“吞吐量”与“处理延迟”就是一对矛盾。吞吐量高,相应的延迟就会低,吞吐量低,相应的延迟就会高。
【状态管理】我们在实时变换的过程中,要有与外部的交互,如入侵检测,以此来保护环境和数据的安全。
【容错能力和容错负荷】要求当流式处理在正常进行中,即使有某些机器挂掉,系统仍能正常运行,整个流式处理框架不受影响。
【流控】也就是流量控制,我们在数据传输的过程中,可能会数据突然增多,为了保证系统不至于负荷过重而崩溃,这时候就需要控制数据密度。
【编程复杂性】相对而言,API设计地越高级,编程负担越低。
2、Flink 原理
Flink的整个组件类似于Spark,它的核心是一个分布式的流式处理框架,在核心之上,有两套API,一套应用于批处理—DataSet API,一套应用于流式处理—DataStream API。
从图中我们可以看到,在两套API下又有更为高级的库(Distributed Streaming Dataflow),而它的整个处理部署方式可以支持本地、集群、云端。
- Flink的整个架构和Spark很相似,有三个主要部分。
一个是提交任务的客户端—Flink Program;还有作业的管理器—JobManager,主要负责任务的调度和状态的检测,以及在整个集群出现故障时进行初步管理;最后是任务管理器—TaskManager,实现业务逻辑的执行,负责把接受到的任务运行之后,将相应的结果输出到外部或进行外部交互。在整个过程中,JobManager是不负责任务执行的。
- Flink的具体编程模型结构:
- flink的transformation操作:
【map】就是做一些映射,比如我们把两个字符串合并成一个字符串,把一个字符串拆成两个或者三个字符串。
【flatMap】类似于把一个记录拆分成两条、三条、甚至是四条记录。
【Filter】就类似于过滤。
【keyBy】就等效于SQL里的group by。
【reduce】就类似于MapReduce里的reduce。
【join】操作就有点类似于我们数据库里面的join。
【aggregate】是一个聚合操作,如计数、求和、求平均等。
【connect】实现把两个流连成一个流。
【repartition】是一个重新分区操作。
- Flink的执行机制:
上图是表现业务逻辑的业务执行图,Flink的执行方式类似于管道,它借鉴了数据库的一些执行原理,实现了自己独特的执行方式。
- Flink的容错机制
Flink在处理数据流时,它的整个数据流里面的数据分为两种,一种是本身业务发给的数据,还有一种是Flink自己插到数据流里面的数据。插入的记录我们叫它barrier,就是栅栏,我们可以把它看成一个表示进度的标记,标记整个数据处理的状态,它从源头发出。从图中我们可以看到,不管是什么流,它都会产生一个checkpoint barrier。
当operator收到栅栏之后,它会把栅栏的状态存储,然后把特定记录发出去,到达第二个operator里面,它又把它的状态放到Master里,它就是这样一步一步去完成的。在这个过程中,如果有一步出现故障,Flink会重复前面的步骤,重新去运行,所以不会出现数据的丢失和错误。
3、Flink的实践:
参考网站:
https://ci.apache.org/projects/flink/flink-docs-release-1.6/internals/stream_checkpointing.html