flink的(Tumbling)滚动窗口

滚动窗口

意义
如果我们是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();

    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值