Flink 学习一
https://flink.apache.org/
1.快速认识Flink
1.1 离线批计算与实时流式计算
批计算:有界流
流式计算:无界流
- 批计算:针对有界流,在计算结果前可以看到整个数据集;
- 流计算:针对无界流,永远无法看到输入数据的整体,数据的输入无法看到结束,数据到达就计算,输出当时(实时)的计算结果;输出结果也是一个无界流;数据到达也可以理解为可以把无界流变成有界流在计算,比如时间划分,数据量划分
思考:如果批很小,是不是也可以理解为流计算,流计算中如果每次数据到达都是一批数据,是不是也是可以理解成为批计算;
是的,两个概念有重复的地方,这里Flink 把流计算和批计算进行了API 层面的统一,是一个流批一体的计算框架;
1.2 Flink 基本框架
分布式,有状态的实时流式处理框架
数据来源可能是数据库,日志,LOT,页面Click 等产生的数据,经过结构化数据之后,可以是存数据库,或者是队列形式 提供给Flink ,在经过计算后输出给Application,日志输出,或者是数据库存储;
Flink 主要是使用java语言开发,对用户提供java,Scala ,python 编程 api,
Flink 以流式数据作为基础,引入有界流来实现批计算,从而实现流批一体
1.3 Flink 运行时架构
一个Flink程序,用户会编写数据的处理逻辑,数据的处理不会直接使用这些处理逻辑;Flink 计算框架会把用户编写的处理逻辑当做一个任务提交给系统,然后由计算框架来把处理逻辑拆分成task ,然后再集群上运行task ;
Flink 计算采用 Master-Slave 架构
- Master的角色是 JobManager ,负责集群和作业管理
- Slave 的角色是 TaskManager, 负责执行计算逻辑
- 客户端程序,提交任务到 集群
1.4 Flink 的特性
1.使用场景
- 事件驱动引用:实时风控,实时推荐,实时营销
- 流,批数据分析:
- 数据管道及ETL:读取数据,处理数据,写入数据
2. 状态管理(状态管理机制)
有状态的Flink应用程序针对本地状态访问进行了优化。任务状态始终保持在内存中,或者,如果状态大小超过可用内存,则保持在磁盘数据结构上的高效访问中。因此,任务通过访问本地(通常在内存中)状态来执行所有计算,从而产生非常低的处理延迟。
Flink通过定期异步地将本地状态检查点指向持久存储,在出现故障时保证了一次状态的一致性。
3.强大的准确性保证
- exactly-once 状态一致性
- 事件时间处理
- 专业的迟到数据处理
4.灵活丰富的API
越往下越底层,拿到的数据越多,可控的细节越多
- 流批数据之上的SQL 查询
- 流批数据之上的 TableAPI
- datastream 流处理算子api , dataset 批处理api
- 精细可控的processFunction
5.规模弹性可控
- 可扩展的分布式框架 算子粒度每个task 的并行度控制
- 支持超大状态管理
- 增量checkpoint 机制
6.运维能力
- 灵活部署
- 高可用性设置
- 保存点恢复机制