1、Flink
是什么?
Flink
核心目标,是“数据流上的有状态计算”(Stateful Computations over Data Streams
)。具体说明:Apache Flink
是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。
2、无界流和有界流?
2.1、无界数据流
-
有定义流的开始,但没有定义流的结束;
-
它们会无休止的产生数据;
-
无界流的数据必须持续处理,即数据被摄取后需要立刻处理。
我们不能等到所有数据都到达再处理,因为输入是无限的。
2.2、有界数据流
-
有定义流的开始,也有定义流的结束;
-
有界流可以在摄取所有数据后再进行计算;
-
有界流所有数据可以被排序,所以并不需要有序摄取;
-
有界流处理通常被称为批处理。
3、有状态流处理
把流处理需要的额外数据保存成一个“状态”,然后针对这条数据进行处理,并且更新状态。这就是所谓的“有状态的流处理”。
- 状态在内存中: 优点,速度快;缺点,可靠性差。
- 状态在分布式系统中: 优点,可靠性高;缺点,速度慢。
4、Flink
的特点
我们处理数据的目标是:低延迟、高吞吐、结果的准确性和良好的容错性。
Flink
主要特点如下:
- 高吞吐和低延迟: 每秒处理数百万个事件,毫秒级延迟。
- 结果的准确性: Flink提供了事件时间(
event-time
)和处理时间(processing-time
)语义。
对于乱序事件流,事件时间语义仍然能提供一致且准确的结果。 - 精确一次(
exactly-once
)的状态一致性保证。 - 可以连接到最常用的外部系统,如
Kafka
、Hive
、JDBC
、HDFS
、Redis
等。 - 高可用: 本身高可用的设置,加上与
K8s
,YARN
和Mesos
的紧密集成,再加上从故障中
快速恢复和动态扩展任务的能力,Flink
能做到以极少的停机时间7×24全天候运行。
5、Flink
和SparkStreaming
-
Spark
以批处理为根本:-
Spark
数据模型:Spark
采用RDD
模型,Spark Streaming
的DStream
实际上也就是一组组小批数据RDD
的集合; -
Spark
运行时架构:Spark
是批计算,将DAG
划分为不同的stage
,一个完成后才可以计算下一个。
-
-
Flink
以流处理为根本:-
Flink
数据模型:Flink
基本数据模型是数据流,以及事件(Event
)序列; -
Flink
运行时架构:Flink
是标准的流执行模式,一个事件在一个节点处理完后可以直接发往下一个节点进行处理。
-
Flink | Streaming | |
计算模型 | 流计算 | 微批处理 |
时间语义 | 事件时间、处理时间 | 处理时间 |
窗口 | 多、灵活 | 少、不灵活(窗口必须是批次的整数倍) |
状态 | 有 | 没有 |
流式 SQL | 有 | 没有 |
6、应用场景
- 电商和市场营销: 实时数据报表、广告投放、实时推荐;
- 物联网(
IOT
): 传感器实时数据采集和显示、实时报警,交通运输业; - 物流配送和服务业: 订单状态实时更新、通知信息推送
- 银行和金融业: 实时结算和通知推送,实时检测异常行为
7、Flink
分层API
-
越顶层越抽象,表达含义越简明,使用越方便
-
越底层越具体,表达能力越丰富,使用越灵活
7.1、有状态流处理
通过底层API
(处理函数),对最原始数据加工处理。底层API
与DataStreamAPI
相集成,可以处理复杂的计算。
7.2、DataStream/DataSet API
DataStream API
(流处理)和DataSet API
(批处理)封装了底层处理函数,提供了通用的模块,比如转换(transformations
,包括map
、flatmap
等),连接(joins
),聚合(aggregations
),窗口(windows
)操作等。注意:Flink1.12
以后,DataStream API
已经实现真正的流批一体,所以DataSetAPI
已经过时。
7.3、Table API
Table API
是以表为中心的声明式编程,其中表可能会动态变化。Table API
遵循关系模型:表有二维数据结构,类似于关系数据库中的表;同时API
提供可比较的操作,例如select
、project
、join
、group-by
、aggregate
等。我们可以在表与 DataStream/DataSet
之间无缝切换,以允许程序将 Table API
与 DataStream
以及DataSet
混合使用。
7.4、SQL
SQL
这一层在语法与表达能力上与Table API
类似,但是是以SQL
查询表达式的形式表现程序。SQL
抽象与Table API
交互密切,同时SQL
查询可以直接在Table API
定义的表上执行。