1.1Flink作用
Flink核心目标是“数据流上的有状态计算”;Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。
1.1.1有界流和无界流
- 无界数据流
- 有定义流的开始,但没有定义流的结束;
- 他们会无休止的产生数据;
- 无界流的数据必须持续处理,即数据被获取后需要立即进行处理。我们不能等到所有数据都到达再处理,应为输入是无限的。
- 有界数据流
- 有定义流的开始,也有定义流的结束;
- 有界流可以再获取所有数据后再进行计算;
- 有界流所有数据可以被排序,所以并不需要有序获取;
- 有界流处理通常被称为批处理。
1.1.2有状态流处理
把流处理需要的额外数据保存成一个”状态“,然后针对这条数据进行处理,并且更新状态。这就是所谓的”有状态的流处理“。
- 状态再内存中:优点,速度快;缺点,可靠性差。
- 状态再分布式系统:优点,可靠性高;缺点,速度慢。
1.2Flink特点
Flink主要特点如下:
- 高吞吐和低延迟。每秒处理数百万个事件,毫秒级延迟。
- 结果的准确性。Flink提供了事件事件(event-time)和处理事件(processing-time)语义。对于乱序事件流,事件时间仍然能提供一致且准确的结果。
- 精确一次(exactly-once)的状态一致性保证。
- 可以连接到最常用的存储系统,如Kafka、Hive、JDBC、HDFS、Redis等。
- 高可用。本身高可用的设置,加上与K8s,YARN和Mesos的紧密集成,再加上从故障中快速恢复和动态扩展任务的能力,Flink能够做到以极少的停机时间7*24全天候运行。
1.3Flink和Spark的区别
- Spark以批处理为根本
- Spark数据模型:Spark采用RDD模型,Spark Streaming的DStream实际上也就是一组组小批数据RDD的集合
- Spark运行时架构:Spark是批处理,将DAG划分为不同的stage,一个完成后才可以计算下一个。
2.Flink以流处理为根本
- Flink数据模型:Flink基本数据模型是数据流,以及事件序列
- Filnk运行时架构:Flink时标准的流执行模式,一个事件在一个节点处理完后可以直接发往下一个节点进行处理。
Flink | Spark | |
计算模型 | 流计算 | 微批计算 |
时间语义 | 事件时间、处理时间 | 处理时间 |
窗口 | 多、灵活 | 少、不灵活(窗口必须是批次的整数) |
状态 | 有 | 没有 |
流式SQL | 有 | 没有 |
1.4Flink分层API
- 越顶层越抽象,表达含义越简明,使用越方便。
- 越低层越具体,表达能力越丰富,使用越灵活。
- 有状态流处理:通过底层API(处理函数),对最原始数据加工处理。底层API与DataStream API相集成,可以处理复杂的计算
- Datastream API(流处理)利DataSetAPI(批处理)封装了底层处理函数,提供了通用的模块,比如转换(tansformations,包括map、flatmap等),连接(joins),聚合(aggregdtions),窗口(windows)操作等。注意:Flink1.12以后,DataStream API已经实现真正的流批一体,所以DataSetAPI已经过时
- Table API 是以表为中心的声明式编程,其中表可能会动态变化。Table API遵循关系模型:表有二维数据结构,类似于关系数据库中的表;同时API提供可比较的操作,例如select、project、jomn、group-by、aggregate等。我们可以在表与 DataStream/Dataset 之间无缝切换,以允许程序将Table API与 DataStream 以及 DataSet 混合使用。
- SQL这一层在语法与表达能力上与Table API类似,但是是以SQL查询表达式的形式表现程序。SQL抽象与Table API交互密切,同时SQL查询可以直接在Table API定义的表上执行。