【Flink】flink四大基石(5)

目录

Flink的四大基石

Window

Time

State

Checkpoint

案例

需求

代码实现

运行,查看结果

增加需求2的实现

重启程序,查看结果


Flink的四大基石

  • Window

  1. 窗口,在一般的流计算中都要先进行开窗,即基于一个什么样的窗口来做这个计算。
  2. 主要有三种窗口:滑动窗口、滚动窗口,会话窗口
  • Time

实现Watemark的机制,能够支持基于事件的时间处理,能够容忍迟到或者乱序的数据。

  • State

管理状态,包括ValueState、ListState、MapState和BroadcastState等

  • Checkpoint

基于Chandy-Lamport算法,校验点,可以从错误中恢复

案例

官网api

Apache Flink 1.12 Documentation: Event-driven Applications

【Flink】flink四大基石(5)_第1张图片

 

需求

基于时间的滚动和滑动窗口

nc -lk 9999

有如下的数据表示:

信号灯的编号和通过该信号灯的车的数量

9,3

9,2

9,7

4,9

2,6

1,5

2,3

5,7

5,5

需求1:每10秒钟统计一次,最近10秒内,各个路口通过红绿灯的汽车的数量,也就是基于时间的滚动窗口

需求2:每10秒钟统计一次,最近20秒内,各个路口通过红绿灯的汽车的数量,也就是基于时间的滑动窗口

代码实现

package cn.edu.hgu.flink.table;



        import lombok.AllArgsConstructor;
        import lombok.Data;
        import lombok.NoArgsConstructor;
        import org.apache.flink.api.common.functions.MapFunction;
        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.SlidingProcessingTimeWindows;
        import org.apache.flink.streaming.api.windowing.assigners.TumblingProcessingTimeWindows;
        import org.apache.flink.streaming.api.windowing.time.Time;

/**
 * @description: flink的window演示
 */
public class FlinkWindowDemo {
    public static void main(String[] args) throws Exception {
        //1.env
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //2.source
        DataStreamSource socketDS = env.socketTextStream("hadoop001",9999);
        //3.transformation
        //将9,3转为CartInfo(9,3)
        SingleOutputStreamOperator cardInfoDS = socketDS.map(new MapFunction() {
            @Override
            public CardInfo map(String value) throws Exception {
                String[] arr = value.split(",");
                return new CardInfo(arr[0],Integer.parseInt(arr[1]));
            }
        });
        //需求1:设置会话时间超过10s,10s内没有数据到来,则触发上个窗口的计算(前提是上一个窗口得有数据)
        SingleOutputStreamOperator result = cardInfoDS.keyBy(CardInfo::getSensorId)
                .window(TumblingProcessingTimeWindows.of(Time.seconds(10)))
                .sum("count");

        //需求2:每10秒统计一次,最近20秒内,各个路口通过红绿灯的汽车的数量,也是基于时间窗口的滑动
        SingleOutputStreamOperator result1 = cardInfoDS.keyBy(CardInfo::getSensorId)
                .window(SlidingProcessingTimeWindows.of(Time.seconds(20),Time.seconds(10)))
                .sum("count");
        //4.sink
//        result.print();
        result1.print();
        //5.execute
        env.execute();
    }
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class CardInfo{
        private String sensorId;//信号灯id
        private Integer count;//通过该信号灯的车的数量
    }
}

运行,查看结果

打开虚拟机的9999端口

【Flink】flink四大基石(5)_第2张图片

 把集群启动起来

【Flink】flink四大基石(5)_第3张图片

 运行程序输入查看结果

【Flink】flink四大基石(5)_第4张图片

 

增加需求2的实现

【Flink】flink四大基石(5)_第5张图片

重启程序,查看结果

 【Flink】flink四大基石(5)_第6张图片

 

到这里flink的所有内容基本上就介绍完了

flink这个系列就结束了

目前我们还剩hive 和spark 没有介绍

知识和科技一直是在进步的,我们要一直学习,终身学习,才能紧跟时代不落后

希望大家一起学习,一起进步。

你可能感兴趣的:(flink,大数据)