有用的实战功能,搭配了适度源码讲解
背景
加入我们需要基于processTime 处理数据,使用5 分钟的滑动窗口。伪代码如下
window(TumblingProcessingTimeWindows.of(Time.minites(10)))
.process(new ProcessWindowFunction<Tuple2<String, Long>, String, String, TimeWindow>() {
@Override
public void process(String s, Context context, Iterable<Tuple2<String, Long>> elements, Collector<String> out) throws Exception {
out.collect(elements.toString());
}
});
s.addSink(new MySink<>("jieguo",true));
思考下上面的代码有什么问题:我们可以看到 window窗口时十分钟,也就是Mysink每次处理的是十分钟内的数据,如果数据流量过大会对下游的写入造成很大的压力, 我们很容易可以考虑到,如果可以有一种策略使得数据达到一定的条数 也触发窗口计算就好了。计算后的数据从窗口移除,然后等窗口结束的时候再次将剩余未参与计算的数据计算一次,这就可以解决下游压力过大的问题,使得窗口的数据被分批次计算。此功能需要自定义Trigger。
代码
package com.test.demo.stream.自定义trigger;
import org.apache.flink.api.common.eventtime.SerializableTimestampAssigner;
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.common.functions.ReduceFunction;
import org.apache.flink.api.common.state.ReducingState;
import org.apache.flink.api.common.state.ReducingStateDescriptor;
import org.apache.flink.api.common.typeutils.base.LongSerializer;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.TimeCharacteristic;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.windowing.ProcessAllWindowFunction;
import org.apache.flink.streaming.api.functions.windowing.ProcessWindowFunction;
import org.apache.flink.streaming.api.windowing.assigners.TumblingEventTimeWindows;
import org.apache.flink.streaming.api.windowing.assigners.TumblingProcessingTimeWindows;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.api.windowing.triggers.ProcessingTimeTrigger;
import org.apache.flink