Flink Window 窗口【更新中】

Flink Window 窗口

在Flink流式计算中,最重要的转换就是窗口转换Window,在DataStream转换图中,可以发现处处都可以对DataStream进行窗口Window计算。
在这里插入图片描述窗口(window)就是从 Streaming 到 Batch 的一个桥梁。窗口将无界流(unbounded data stream)划分很多有界流(bounded stream),对无界流进行计算。

在这里插入图片描述
在实际业务需求中,往往说窗口,指的就是基于时间Time窗口,比如最近1分钟内数据,指的就是1分钟时间内产生的数据,放在窗口中

Flink Window 窗口的结构中,有两个必须的两个操作:

  • 第一、窗口分配器(Window Assigner):将数据流中的元素分配到对应的窗口。
  • 第二、窗口函数(Window Function):当满足窗口触发条件后,对窗口内的数据使用窗口处理函数(Window Function)进行处理,常用的有reduce、aggregate、process
  • 其他的triggerevictor则是窗口的触发和销毁过程中的附加选项,主要面向需要更多自定义的高级编程者,如果不设置则会使用默认的配置。
    在这里插入图片描述
  • 上图是窗口的生命周期示意图,假如设置的是一个10分钟的滚动窗口,第一个窗口的起始时间是0:00,结束时间是0:10,后面以此类推。
  • 当数据流中的元素流入后,窗口分配器会根据时间(Event Time或Processing Time)分配给相应的窗口。相应窗口满足了触发条件,比如已经到了窗口的结束时间,会触发相应的Window Function进行计算

在Flink计算引擎中,支持窗口类型有很多种,几乎所有Streaming流式计算引擎需要实现窗口都支持。

在这里插入图片描述

  • 1)、时间窗口TimeWindow

    • 按照时间间隔划分出窗口,并对窗口中数据进行计,如每xx分钟统计,最近xx分钟的数据
    • 划分为:**滚动(Tumbling)窗口和滑动(Sliding)**窗口
  • 2)、计数窗口CountWindow

    • 按照数据条目数进行设置窗口,比如每10条数据统计一次
    • 划分为:**滚动(Tumbling)窗口和滑动(Sliding)**窗口
    • [此种方式窗口计算,在实际项目中使用不多,但是有些特殊业务需要,需要使用此场景。]
      在这里插入图片描述
package com.lyj.sx.flink.day05;

import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.AllWindowedStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.windows.GlobalWindow;

public class CountWindowAllDemo {
    public static void main(String[] args) throws Exception {
         StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
         DataStreamSource<String> source = env.socketTextStream("192.168.25.62", 8889);
         SingleOutputStreamOperator<Integer> map = source.map(Integer::parseInt);
        //不keyBy,直接划分窗口
        //窗口内的数据达到5条,就生成一个窗口,然后对窗口内的数据进行计算
         AllWindowedStream<Integer, GlobalWindow> win = map.countWindowAll(5);
         SingleOutputStreamOperator<Integer> sum = win.sum(0);
         sum.print();
         env.execute("pxj");


    }
}
package com.lyj.sx.flink.day05;

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

public class CountWindowDemo {
    public static void main(String[] args)throws  Exception {
         StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
         DataStreamSource<String> source = env.socketTextStream("192.168.25.62", 8889);
         SingleOutputStreamOperator<Tuple2<String, Integer>> map = source.map(new MapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public Tuple2<String, Integer> map(String value) throws Exception {
                final String[] split = value.split(" ");
                return Tuple2.of(split[0], Integer.parseInt(split[1]));
            }
        });
         SingleOutputStreamOperator<Tuple2<String, Integer>> summed = map.keyBy(t -> t.f0).countWindow(5).sum(1);
         summed.print();
         env.execute("pxj");
    }
}
package com.lyj.sx.flink.day05;

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.datastream.WindowedStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
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.windows.TimeWindow;

import java.util.concurrent.TimeUnit;

/**
 * 滚动窗口:按照指定的时间进行滚动,滚动的时间和窗口的长度是一致的,窗口和窗口之间没有重叠
 *
 * 按照时间划分的窗口,跟窗口内数据的条数无关,可以按照EventTime划分窗口,也可以按照ProcessingTime划分窗口
 *
 * 窗口也分为keyedWindow和NonKeyedWindow(Window和WindowFunction对应的Task并行度为1)
 */
public class TumblingWindowAllDemo {
    public static void main(String[] args) throws  Exception {
         StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
         DataStreamSource<String> source = env.socketTextStream("192.168.25.62", 8889);
         SingleOutputStreamOperator<Tuple2<String, Integer>> map = source.map(new MapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public Tuple2<String, Integer> map(String value) throws Exception {
                String[] split = value.split(",");
                return Tuple2.of(split[0], Integer.parseInt(split[1]));
            }
        });
         WindowedStream<Tuple2<String, Integer>, String, TimeWindow> window = map.keyBy(t -> t.f0).window(TumblingProcessingTimeWindows.of(Time.of(10000, TimeUnit.MILLISECONDS)));
         SingleOutputStreamOperator<Tuple2<String, Integer>> summed = window.sum(1);
         summed.print();
         env.execute("pxj");
    }
}
package com.lyj.sx.flink.day05;

import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.assigners.ProcessingTimeSessionWindows;
import org.apache.flink.streaming.api.windowing.time.Time;

public class SessionWindowAllDemo {
    public static void main(String[] args) throws Exception {
         StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
         DataStreamSource<String> source = env.socketTextStream("192.168.25.62", 8888);
         SingleOutputStreamOperator<Integer> map = source.map(Integer::parseInt);
         SingleOutputStreamOperator<Integer> sum = map.windowAll(ProcessingTimeSessionWindows.withGap(Time.seconds(5))).sum(0);
         sum.print();
         env.execute("pxj");
    }
}
package com.lyj.sx.flink.day05;

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.assigners.ProcessingTimeSessionWindows;
import org.apache.flink.streaming.api.windowing.time.Time;

/**
 * 先KeyBy再划分Sessionindow,即KeyedWindow,Window和WindowFunction对应的Task是可以多个并行的
 *
 * 按照系统时间和最后一条进入窗口的数据划分窗口
 *
 * 同一个分区同一个组内的数据,当系统时间减去进入到这个组内的最后一条数据的时间>指定的时间间隔,那么这个组单独触发
 */public class SessionWindowDemo {
    public static void main(String[] args) throws Exception {
         StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
         DataStreamSource<String> source = env.socketTextStream("192.168.25.62", 8889);
         SingleOutputStreamOperator<Tuple2<String, Integer>> map = source.map(new MapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public Tuple2<String, Integer> map(String value) throws Exception {
                String[] fields = value.split(",");
                return Tuple2.of(fields[0], Integer.parseInt(fields[1]));
            }
        });
         SingleOutputStreamOperator<Tuple2<String, Integer>> summed = map.keyBy(t -> t.f0).window(ProcessingTimeSessionWindows.withGap(Time.seconds(5))).sum(1);
         summed.print();
         env.execute("pxj");
    }
}
package com.lyj.sx.flink.day05;

import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.assigners.ProcessingTimeSessionWindows;
import org.apache.flink.streaming.api.windowing.time.Time;

public class SessionWindowAllDemo {
    public static void main(String[] args) throws Exception {
         StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());
         DataStreamSource<String> source = env.socketTextStream("192.168.25.62", 8888);
         SingleOutputStreamOperator<Integer> map = source.map(Integer::parseInt);
         SingleOutputStreamOperator<Integer> sum = map.windowAll(ProcessingTimeSessionWindows.withGap(Time.seconds(5))).sum(0);
         sum.print();
         env.execute("pxj");
    }
}

作者:pxj_sx(潘陈沈)
日期:2024-07-28 21:46:30 更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值