flink是什么
是一个框架和分布式处理引擎,在无边界和有边界数据流上纪念性有状态的计算
主要特性
1.批流统一
批处理:数据
全部访问完成后进行操作
有界、持久、大量,适合访问全套记录才能完成的工作,一般用于
离线统计
流处理:
来一条数据处理一条数据
无界、实时,不需要操作整个系统
无界流(Datastream):只有开始,没有结束,要以特定的顺序获取,并且获取后立即处理
有界流(DataSet):开始结束都有,数据全部获取后执行,
可以被排序
2.性能卓越
高吞吐:同时处理大量数据
低延时:快速返回结果
3.规模计算
支持超大状态与增量检查点机制
状态:计算过程中需要存储的数据
检查机制:备份
4.生态兼容
支持与yarn集成
支持与kubernetes集成
支持单机模式运行
5.高容错
故障自动重试
一致性检查点
保证故障场景下精确一次的状态一致性
并行度
一个算子的子任务的个数被称为其并行度
包含并行任务的数据流,就是并行数据流
一个流程序的并行度,可以认为就是其所有算子中最大的并行度
设置并行度
stream.map(word -> Tuple2.of(word, 1L)).
setParallelism(2)
或
env.setParallelism(2)
窗口分类
1)按照驱动分类
(1)时间窗口:时间定义起始
(2)计数窗口:达到指定个数
2)按照窗口分配数据的规则分类
(1)滚动窗口
窗口内大小相同,不会有重叠,首尾相连 如:123,456,789
(2)滑动窗口
窗口内大小相同,有重叠,首尾不相连 如:123,234,345
(3)会话窗口:基于时间定义
会话超时时间,两个会话窗口之间的最小距离,窗口长度、起始时间不确定,窗口之间无关联,不重叠
(4)全局窗口:窗口没结束时,不会做触发计算
窗口API
1)按键分区(Keyed Windows)
stream.keyBy(...).window(...)
2)非按键分区(Non-Keyed Windows)
stream.windowAll(...)
代码中窗口API的调用
窗口操作主要有两个部分:窗口分配器(Window Assigners)和窗口函数(Window Functions)。
stream.keyBy(<key selector>)
.window(<window assigner>)
.aggregate(<window function>)
时间窗口
时间窗口的计算频次
时间窗口的大小
时间窗口内的数据的处理逻辑
时间窗口计算模型的处理机制
输入数据流----------->时间窗口计算----------->输出数据流
时间语义
事件时间(Event Time):数据产生的时间
处理时间(Processing Time):数据真正被处理的时间
进入Flink的时间:(Ingestion Time):每个事件将进入Flink时的时间作为时间戳
时间语义:
是以事件时间还是处理时间进行计算
// TODO 1.指定窗口分配器: 指定 用 哪一种窗口 --- 时间 or 计数? 滚动、滑动、会话?
// 1.1 没有keyby的窗口: 窗口内的 所有数据 进入同一个 子任务,并行度值只能为1
//sensorDS.windowAll();
// 1.2 有keyby的窗口()
//sensorKS.window();每个key上都定义了一组窗口,各自独立地进行统计计算
//sensorKS.window();
基于时间
滚动窗口,窗口长度10秒
sensorKS.window(TumblingProcessingTimeWindows.of(Time.seconds(10)));
滑动窗口,长度10秒,步长2秒
sensorKS.window(SlidingProcessingTimeWindows.of(Time.seconds(10),Time.seconds(2)));
会话窗口,超过五秒没数据,自动生成新的窗口
sensorKS.window(ProcessingTimeSessionWindows.withGap(Time.seconds(5)));
基于计数 数据条数
窗口长度为5
sensorKS.countWindow(5);
窗口长度为5 步长2
sensorKS.countWindow(5,2);
全局窗口 计数窗口底层用这个 需自定义触发器使用
sensorKS.window(GlobalWindows.create())
水位线(Watermark)(水印)
衡量事件时间进展的标记
水位线特性
是插入到数据流中的一个
标记,可以认为是一个
特殊的数据
主要内容是一个时间戳,
表示当前事件时间的进展
基于数据的时间戳生成的
必须
单调递增
设置
延迟,保证正确
处理乱序数据
一个水位线watermark(t) ,表示当前流中事件时间已达到时间戳,表示t之前的所有数据已到齐,不会有t1<=t
有序流中的水位线:按生成的先后顺序进入流中,每条数据产生一个水位线
数据量大时,每隔一段时间生成一个水位线
乱序流中的水位线:因网络传输延迟,使顺序改变
判断是否比前面的小,小则进入,否则进入新的
版权归原作者 内向仓鼠 所有, 如有侵权,请联系我们删除。