Flink
Flink:是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算,支持流批一体化处理,从底层APIS->核心APIS(DataStream、DataSet)->声明式领域专用语言(Table API)->最高层语言(SQL)。
批处理:有界、持久、大量,批处理适合需要访问全套记录才能完成的计算工作,一般用于离线统计;
流处理:无界、实时,流处理无需针对整个数据集执行操作,而是对通过系统传输的每个数据项进行操作,一般用于实时统计;
一、基础
1. 特点
A. 高吞吐和低延迟,可每秒处理数百万各事件,毫秒级延迟;
B. 结果的准确性,提供了事件时间和处理时间语义;
C. 精准一次的状态一致性保证;
D. 可以连接到最常用的存储系统,如Kafka、HDFS等;
E. 高可用:可与K8s、YARN等集成,具有可从故障中快速恢复和动态扩展任务的能力。
2. 角色
A. 客户端(Client):代码由客户端获取并做转换,之后提交给JobManger;
B. JobManger:对作业进行调度,将任务分发给TaskManger;
C. TaskManger:干活的,进行数据的处理操作。
3. 部署模式
A. 会话模式:
B. 单作业模式:
C. 应用模式:
4. 运行模式
A. Standalone模式:Flink自带集群,开发测试环境使用;
B. Yarn模式:计算资源统一由Hadoop YARN管理,生产环境使用;
C. K8s模式:
D. 历史服务器
5. 架构核心概念
A. 并行度(Parallelism):
B. 算子链(Operator Chain):
C. 任务槽(Task slots):
二、DataStream API
DataSream由五个部分构成:获取执行环境(Environment)——>获取数据源(Source)——>转化操作(Transformation)——>输出(Sink)——>触发执行(Execute),实质就是进行各种转化操作。
1. 执行环境
A. 创建执行环境:本地和远程执行环境;
B. 执行模式:流(Streaming)和批(Batch)执行模式,其中流适用于需要连续增量处理的无边界作业、批适用于已知输入但不会连续运行的有边界作业;
C. 触发程序执行:Flink是由事件驱动的,只有等待数据到来,才会触发真正的计算。
2. 源算子
A. 从文件读取数据:属于有界数据,env.fromSource(),需要引入flink-connector-files依赖;
B. 从Socket读取数据:吞吐量小的流处理,env.socketTextStream();
C. 从Kafka读取数据:
D. 从外部系统读取数据:其它Connectors连接器。
3. 数据类型:Types常见类型类
A. 基本类型:如String、Date;
B. 数组类型:基本数组类型和对象数组类型;
C. 符合数据类型:如元组类型(Tuple)、POJO;
D. 辅助类型:如List、Map;
E. 泛型类型
4. 转换算子
注意:参数为索引,表示第几个元素,returns是用来解决"泛型擦除"的问题,显示提供类型信息;
A. 基本转换算子:map(映射)、filter(过滤)、flatMap(扁平映射)
B. 聚合算子:keyBy(分组)、简单聚合(max、min、sum等)、reduce(归约聚合)
C. 物理分区算子
D. 分流
E. 合流
5. 输出算子
A. 输出到文件:stream.sinkTo();
B. 输出到Kafka:
C. 输出到MySQL:
D. 输出到外部系统:其它Connectors连接器。
三. 窗口(Window)
A. 概念:是将无限数据流切割成有限的‘数据块’进行处理,窗口是在开始时间数据到达时才创建,当到达结束时间时就会对收集的数据进行处理并关闭,可按键分区(Keyed)处理;
B. 窗口的分类
按度量方式可分为:时间窗口和计数窗口;
按分配数据方式可分为:
滚动窗口(Tumbling Windows):窗口之间没有重叠,也没有间隔,是连续的;
滑动窗口(Sliding Windows):大小是固定的,但窗口之间不是首尾相接的;
会话窗口(Session Windows):有会话超时时间,对数据进行分组的;
全局窗口:全局有效。
C. 窗口函数:分增量聚合函数(Reduce和Aggregate)和全窗口函数(Process)。
D. 窗口触发器和移除器:
可参考:Flink官方文档