Flink3(分区算子+窗口)
2023-02-02 19:36:56 0 举报
Flink3(分区算子+窗口)
作者其他创作
大纲/内容
Custom自定义分区
全量
source.map(w-> Tuple2.of(w.split(\":\
shuffle洗牌分区(随机)
TimeEvent-Process
Count Window
未分组
Tumbling Window滚动窗口
//TimeWindow--Slidingsource.map(word -> Tuple2.of(word.split(\":\
Window All
KeyGroup--->按Key的Hash值输出到下游算子实例中map.keyBy(a->a).print(\"keyByPartitioner\").setParallelism(4);
产生原因
Flink 窗口模型还允许在窗口分配器和触发器之外指定一个可选的驱逐器(Evictor)interface org.apache.flink.streaming.api.windowing.evictors.Evictorvoid evictBeforevoid evictAfter内置驱逐器:CountEvictor: 数量别除器。在 Window 中保留指定数量的元素,并从窗口头部开始丢弃其余元素DeltaEvictor: 阈值剔除器。计算 Window 中最后一个元素与其余每个元素之间的增量,丢弃增量大于或等于阈值的元素。TimeEvictor: 时间剔除器。保留 Window 中最近一段时间内的元素,并丢弃其余元素。
养肥了再杀对所有进入该窗口的数据进行缓存,等到窗口触发时才会遍历窗口内所有数据,进行结果计算。延迟,占用缓存某些场景下: 必须使用窗口的起始时间等一类的上下文数据那么必须使用全量计算将来使用全窗口计算的时候,要注意窗口的大小apply-->WindowFunction process->ProcessWindowFunction.
non-keyed
//使用 process 做了flatMap功能source.font color=\"#ff0000\
全局分区---->输出到第一个map.global().print(\"GlobalPartitioner\").setParallelism(4);
Trigger 决定了一个窗口 (由*window assigner* 定义) 何时可以被window function* 处理每个WindowAssigner(窗口分配程序)都有一个默认的Trigger~。如果需要font color=\"#ff0000\
在keyBY前进行窗口方法.windowAll(TumblingProcessingTimeWindows.of(Time.seconds(5)))
并行度
Reduce
时间语义
Session
.trigger(CountTrigger.of(10))
forward向前的分区(1对1)
事件时间程序员需要将其嵌入到数据的内部zhangsan:hello:timestamp[事件时间将来分析数据的时候,只需要将数据的时间戳解析出来就可以获取到事件时间而且这个事件时间是唯一的
Tumbling滚动窗口的大小是固定的,且各自范围之间不重誓触发条件:时间窗口得到5秒的宽度并且当前窗口包含数据
产生时间
处理时间
Flink分区算子
Process
窗口函数
处理时间ProcessTime
Tubling滚动
AggregateFunction
Session Windown
TumblingProcessingTimeWindows(滚动处理时间窗口)TumblingEventTimeWindows(滚动事件时间窗口)
Process方法自定义算子
ReduceFunction
GlobalWindows
Time Window
增量聚合函数
Aggregate中间结果
KeyGroup(hash分配)
按照指定的大小进行切开(设置窗口大小)触发条件: 数据的数量等于窗口的大小(在刚开始时未满窗口大小不会进行计算)
处理时间是指正在执行相应操作的机器的系统时间。每个机器的系统时间有可能略有差异数据在上下游处理的过程中,上下游的处理时间也有可能略有差异
.evictor(CountEvictor.of(10))
侧输出功能
窗口计算函数
把所有的数据放在一个窗口中进行计算也会有具体的分类: 上面的 Tumbling Sliding Session 在全局都是可以被使用的使用的方式参照上面的代码
窗口操作
窗口驱逐Evictor
默认的TriggerEventTimeTrigger: 通过对比EentTime和窗口的Endtime确定是否发窗口计算,如果EventTime大于Window EndTime则触发,否则不触发,窗口将继续等待ProcessTimeriqger:通过对比ProcessTime和商口EndTme确定是否触发窗口,如果ProesTime大于EndTime则触发计算,否则窗口继续等待ContinuousEventTimeTrigger: 根据间隔时间font color=\"#ff0000\
//转换 aa:33source.map(word -> Tuple2.of(word.split(\":\
count
洗牌分区--->随机进行洗牌分配map.shuffle().print(\"shufflePartitioner\").setParallelism(4);
font color=\"#ff0000\
窗口触发Trigger
rescale重新缩放分区(比例)
Global自定义
ProcessingTimeSessionWindows(处理时间会话窗口)EventTimeSessionWindows(事件时间会话窗口)
Process function
//读取一次,将符合要求的数据全部取出-------------OutputTag<String> outputTag1 = new OutputTag<>(\"outputTag1\") {};OutputTag<String> outputTag2 = new OutputTag<>(\"outputTag2\") {};SingleOutputStreamOperator<String> stream = source.font color=\"#ff0000\
Sliding滑动
ProcessWindowFunction
广播分区--->上游的每个结点都会将数据分派到下游的每个结点map.broadcast().print(\"broadcastPartitioner\").setParallelism(4);
摄入时间Ingestion time
时间的操作
Window
SlidingProcessingTimeWindows(滑动处理时间窗口)SlidingEventTimeWindows(滑动事件时间窗口)
Sliding Window滑动窗口
span style=\"font-size: inherit;\
全局聚合函数
SessionFlink:窗口是从第一次发送数据开始,就会创建一个会话,保存的时常为Size如果超过时常都没有再发送过数据,这个窗口就开始进行计算如果在size的时间内重新发送一条数据,那么保存的时常会被重置为Size没有固定的开始或结束时间开始:第一次收到数据结束:超过会话时常还没有接收到数据特点:窗口内的数据数量不可控,和会话的内接受的数据量相关会话窗口不重复
窗口类型
keyed
rebalance平衡分区(轮询)
Global全局分区(首个)
事件时间EventTime
broadcast广播分区(每次发送)
可以自定义窗口如果没有定义触发规则: 整个subTask中就只有一个窗口,且一直存在,不会触发计算使用需要非常慎重,注意触发时机和数据清理注意: 触发和清理
//转换 source.map(ws-> Tuple2.of(ws.split(\":\
增量
假设时间窗口定义为5秒是从当前整点的5秒为一个窗口,而不是开启程序的时间如果10秒钟一个窗口 0-10 10-20 20-30 30-40 40-50 50-00如果当前窗口内有数据,就进行计算如果当前窗口内没有任何数据,则不进行任何计算,节省系统的资源
0 条评论
下一页