是一个开源的分布式,高可用,高性能,准确的流处理框
主要由Java实现
支持流(stream)处理和批(batch)处理
flink原生支持迭代计算,内存管理和程序优化

优点

flink使用JedisCluster flink jdbcsink_流处理


Flink的架构图

flink使用JedisCluster flink jdbcsink_流处理_02

Flink的组件
DataSource: 数据源
Transformations: 算子(处理逻辑)
Data Sink:数据沉底(数据保存的位置)

流处理与批处理的区别
对于一个流处理系统,其节点的数据传输标准模型为:当一条数据被处理完之后,序列化到缓存
然后立刻通过网络传输到另一个节点,由另一个节点继续处理
对于一个批处理系统,其节点的数据传输标准模式为:当一条数据被处理完之后,序列化到缓存,并不会立马传输到另一个节点,当缓存写满,就持久到本地磁盘上,当所有数据都在当前节点处理完,才会立刻将处理后的数据传输到另一个节点。
这两种数据传输模式是两种极端,流处理对应的是低延迟的需求而批处理对应高吞吐量。
而Flink同时支持这两种模式,通过调整缓存块的值,可以达到这两种模式,缓存块为0,对应流处理,而缓存块无限大,对应批处理。

flink使用JedisCluster flink jdbcsink_flink_03


flink使用JedisCluster flink jdbcsink_flink使用JedisCluster_04


flink使用JedisCluster flink jdbcsink_流处理_05

第一, Flink 具备统一的框架处理有界和无界两种数据流的能力
第二, 部署灵活,Flink 底层支持多种资源调度器,包括 Yarn、Kubernetes 等。Flink 自身带的 Standalone 的调度器,在部署上也十分灵活。
第三, 极高的可伸缩性,可伸缩性对于分布式系统十分重要,阿里巴巴双 11 大屏采用 Flink 处理海量数据,使用过程中测得 Flink 峰值可达 17 亿 / 秒。
第四, 极致的流式处理性能。Flink 相对于 Storm 最大的特点是将状态语义完全抽象到框架中,支持本地状态读取,避免了大量网络 IO,可以极大提升状态存取的性能。

开发实践

Java开发

flink使用JedisCluster flink jdbcsink_流处理_06

scala开发

flink使用JedisCluster flink jdbcsink_缓存_07


flink使用JedisCluster flink jdbcsink_flink_08


flink使用JedisCluster flink jdbcsink_flink使用JedisCluster_09


flink使用JedisCluster flink jdbcsink_流处理_10


flink使用JedisCluster flink jdbcsink_流处理_11


flink使用JedisCluster flink jdbcsink_Time_12


flink使用JedisCluster flink jdbcsink_Time_13


flink使用JedisCluster flink jdbcsink_缓存_14


flink使用JedisCluster flink jdbcsink_flink使用JedisCluster_15


flink使用JedisCluster flink jdbcsink_flink_16


Source中的执行顺序为:

open()–>run()–>close()

自定义的Source需要继承RichSourceFunction

Sink中的执行顺序
继承 RichSinkFunction 抽象类,重写 invoke 方法
open()-invoke()-close()

Time
分为Event Time ,Ingestion Time和Window processing Time
Event Time : 事件时间
Ingestion Time:进入Flink的时间
Window processing Time :达到window 中 Flink中处理的时间
通常我们所需要的为Event Time

Window (将无限的流分割成有限大的buckets)
CountWindow : 按照指定的数据条数生成一个Window,与时间无关
TimeWindow: 按照时间生成Window
TimeWindow按照原理不同又可以分为Tumbling Window 滚动窗口 Sliding滑动窗口 Session Window会话窗口

Tumbling Window : 时间对齐,窗口大小固定,没有重叠 (一个参数,窗口大小)
Sliding :时间对齐,窗口大小固定,有重叠 (两个参数,窗口大小,滑动频率)

流处理架构

flink使用JedisCluster flink jdbcsink_缓存_17

主要分为消息传输层和流处理层

状态

flink使用JedisCluster flink jdbcsink_流处理_18


flink使用JedisCluster flink jdbcsink_缓存_19


flink使用JedisCluster flink jdbcsink_流处理_20

Row state不太常用,使用复杂

Manager state又分为一下两种

flink使用JedisCluster flink jdbcsink_flink_21


flink使用JedisCluster flink jdbcsink_流处理_22

容错机制与故障恢复(确保不丢不重)

flink使用JedisCluster flink jdbcsink_缓存_23

如何制作checkpoint

flink使用JedisCluster flink jdbcsink_缓存_24

第二行代码:设置每1秒制作一个checkpoint

第三行:设置checkpoint的模式

第4行:设置两个checkpoint最小的等待时间,避免过于频繁制作checkpoint,消耗io

第五行:设置制作checkpoint的超时时间

第六行:设置同时有多少checkpoint在做

flink使用JedisCluster flink jdbcsink_Time_25


flink使用JedisCluster flink jdbcsink_流处理_26


flink使用JedisCluster flink jdbcsink_flink_27


flink使用JedisCluster flink jdbcsink_缓存_28


Table API

flink使用JedisCluster flink jdbcsink_Time_29


flink使用JedisCluster flink jdbcsink_flink使用JedisCluster_30


flink使用JedisCluster flink jdbcsink_flink_31


flink使用JedisCluster flink jdbcsink_Time_32

通过state TTL config解决状态的无限增长。Flink Runtime解析

flink使用JedisCluster flink jdbcsink_flink_33

FLINK运行时的相关组件

flink使用JedisCluster flink jdbcsink_流处理_34


flink使用JedisCluster flink jdbcsink_flink使用JedisCluster_35

Flink支持的数据类型

flink使用JedisCluster flink jdbcsink_流处理_36

flink序列化最长见的场景:

flink使用JedisCluster flink jdbcsink_流处理_37

Metric:指标

flink使用JedisCluster flink jdbcsink_缓存_38

Graph
StreamGraph:是根据用户通过Stream API编写的代码生成的最初的图。表示程序的拓扑结构。
JobGraph: StreamGraph经过优化后生成了JobGraph,提交给JobManager的数据结构。主要的优化为,将多个符合条件的中断链连在一起作为一个节点,这样可以减少数据在数组之间流动所需要的序列化/反序列化/传输消耗。
ExecutionGraph: JobManager根据JobGraph生成ExecutionGraph。ExecutionGraph是JobGraph的并行化版本,是调度层最核心的数据结构。
物理执行图: JobManager根据ExecutionGraph对Job进行调度后,在各个TaskManager上部署Task后形成的“图”,并不是一个具体的数据结构。

状态后台的选择

flink使用JedisCluster flink jdbcsink_flink使用JedisCluster_39