意义
如果我们是wordcount的程序,随着数据的涌入累计相加,计算系统的压力会越来越来越大,
但是我们让我滚动窗口,每半个小时执行一次,只执行这半个小时之内的数据,而后直接采取上半
个小时累计的结果进行累计,这样计算压力会很小!节约资源提高效率
例子
我们设置公交车10秒钟跑一趟,陆陆续续来的客户端输入的数据,
公交车来了,没人空跑一圈 不执行,相当于不显示,
公交车来了,站点有5个人就是拉5个人走,相当于执行5条数据,
公交车来了,站点一次性来了50个人但是公家车到了10秒钟要走了,只有20个上车了,就只带走这20个乘客,剩下的30个人只能等下一趟公交车了,相当于这一趟只执行20条数据,剩下的数据将会和后来的数据一起在10秒钟结束的时候一起执行!
例子意义
如果我们没有设置滚动窗口,只要公交站台一有人就,就要在一瞬间出动一台公交车去迎接他,只要一有人,就要出动一台公交车去迎接他,这样的的话,公交站台站的人源源不断,我们出动的公交车也是源源不断,非常浪费公共资源,而滚动窗口的意义就在于,定时发车,只要一到发车点他都会按时按点出现在站台去迎接所有的乘客,不断多少都能拉走,节省资源提高效率!
如何设定时间
不管有没有乘客从程序一执行就开始发车,到底从什么时候开始计算下一次的发车时间是根据第一批乘客,到站,登车或者下车(自行设定)的一瞬间进行卡表计算下次发车时间的.
Event time:数据产生的时间 实际上就是第一个乘客到站的时间开始计算也就是数据输入完按动回车的一瞬间开始计算!
Ingestion time: 数据进入到flink的一瞬间 实际上就是乘客登车的时间也就是数据归拢到flink的一瞬间!
Processing time: 数据被我们算子计算的时候的一瞬间 实际上就是乘客下车的一瞬间也就是程序被执行的一瞬间!
未分组按照Processingtime时间执行:
public class Tumbling {
public static void main(String[] args) throws Exception{
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource<String> lines = env.socketTextStream("localhost", 8888);
SingleOutputStreamOperator<Integer> upper = lines.map(Integer::parseInt);
//设置发车的时间
AllWindowedStream<Integer, TimeWindow> all = upper.windowAll(TumblingProcessingTimeWindows.of(Time.seconds(5)));
//将乘客相加
SingleOutputStreamOperator<Integer> summed = all.sum(0);
summed.print();
env.execute();
}
}
分组按照Processingtime时间执行:
public class Tumbling2 {
public static void main(String[] args) throws Exception{
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource<String> lines = env.socketTextStream("localhost", 8888);
//设置分组
SingleOutputStreamOperator<Tuple2<String, Integer>> wordAndOne = lines.map(new MapFunction<String, Tuple2<String, Integer>>() {
@Override
public Tuple2<String, Integer> map(String value) throws Exception {
return Tuple2.of(value, 1);
}
});
KeyedStream<Tuple2<String, Integer>, Tuple> keyed = wordAndOne.keyBy(0);
//设置发车的时间
WindowedStream<Tuple2<String, Integer>, Tuple, TimeWindow> window = keyed.window(TumblingProcessingTimeWindows.of(Time.seconds(5)));
//将乘客相加
SingleOutputStreamOperator<Tuple2<String, Integer>> summed = window.sum(1);
summed.print();
env.execute();
}
}