美文网首页
Flink_四大基石windows && Time

Flink_四大基石windows && Time

作者: Eqo | 来源:发表于2022-08-31 17:49 被阅读0次

    Flink 流式计算引擎:四大基石
    Window窗口和Time时间
    基于时间窗口计算,尤其是事件时间窗口,其中滚动Tumbling窗口和滑动Sliding窗口
    State状态和Checkpoint检查点
    处理数据时,使用到前面计算结果,将其存储到State中,称之为State
    定期将程序中状态数据进行保存,称之为Checkpoint(程序)或Savepoint(人为)

    ======================================================================================

    1、Window 窗口计算
    1) 将流式数据划分为一批次一批次,对每批次数据进行处理分析
    每批次:窗口window
    对每批次数据处理称之为窗口计算
    【Window 窗口时流式计算到批处理一个桥梁】
    2) 核心点:
    第1点:窗口分配器
    WindowAssinger,将流中数据分配到Window中(如何将流中数据划分为Window窗口)
    第2点:窗口函数
    WindowFunction,对窗口中数据进行计算
    3) Window窗口类型
    第1种方式:时间窗口TimeWindow(start和end)
    滚动时间窗口(翻滚时间窗口)
    size = slide,流中数据仅仅被分配到1个窗口中,数据不会被重复计算
    【使用最多】
    滑动时间窗口
    size != slide,通常size > slide,流中数据可能被分配到多个窗口中,数据被重复计算
    【绝大多数场景中,不允许数据丢失计算,可以重复计算】
    第2种方式:计数窗口CountWindow
    滚动计数窗口和滑动计数窗口
    第3种方式:会话窗口SessionWindow
    基于时间会话窗口(start和end)
    设置会话时间间隔gap,某个数据到达之后,超过设置时间间隔没有后续数据的到达,将前面的数据放在一个惶恐
    4) Window API:2种类型
    第1类:KeyedStream Window API
    将数据流指定key分组,再进行窗口及思源
    datastream.keyBy().window().apply/process
    第2类:DataStream Window API
    直接对数据流进行窗口计算
    datastream.windowAll.apply/process
    5) 调用WindowStream中apply转换算子,对窗口数据计算
    如果是KededStream分组流设置窗口
    WindowFunction 窗口函数接口,有4个泛型参数:IN,OUT,Key,Window
    如果是DataStream数 据流设置窗口
    AllWindowFunction 窗口函数接口,有3个泛型参数:IN,OUT,Window

    2、Time 时间语义
    1) 最初分为三种语义
    第1种语义:EventTime 事件时间
    数据产生的时间,嵌入在数据的字段中,比如订单数据的订单时间
    第2种语义:InjectionTime 摄入时间
    表示流式流式计算程序中数据源Source获取数据的时间
    第3种语义:ProcessingTime 处理时间
    表示流式计算程序处理数据的时间
    2) flink 1.11版本,变为2种语义
    EventTime和InjectionTime
    【实际Job运行时,InjectionTime几乎与ProcessingTime一样的,所以在API中,只提供事件时间和处理时间窗口划分,到flink 新版本中,为了简化理论,直接将摄入时间去除。】
    3) 事件时间语义最为关键
    在实际开发中,当设置时间窗口计算时,往往几乎都是基于事件时间设置窗口计算
    滚动事件时间窗口TumblingEventTimeWindow
    滑动事件时间窗口SlidingEventTimeWindow
    事件时间会话窗口EventTimeSessionWindow

        如果是处理时间窗口,诞生出3个类型窗口
            滚动处理时间窗口TumblingProcessingTimeWindow
            滑动处理时间窗口SlidingProcessingTimeWindow 
            处理时间会话窗口EventProcessingSessionWindow          
    4) 如果基于事件时间窗口,设置开发时步骤
        step1. 提取数据中事件时间,转换为Long类型
            表示告知Job每条数据事件时间,就可以将数据划分到对应窗口中
        step2. 设置窗口时,使用基于EventTime事件时间窗口
            EventTimeWindow
    

    3、Flink Window窗口计算:基于事件时间窗口时就按
    在实际数据收集采集过程中,由于网络延迟等故障原因,导致数据先产生后到达,有的数据迟到很久很久,此时少数数据乱序
    理想情况:
    1 2 3 4 5 6 7
    事件情况:
    1 2 4 3 6 5 7

    1) 默认方案:
        当数据到达时,所在窗口已被触发计算,并且销毁掉,此时直接丢弃数据
    
    2) 方案1:数据乱序或延迟时,依然被计算
        第1种方式:Watermark 水位线机制
            【让窗口计算时间,等一等,比如等待50ms,再进行计算,此时可能等待窗口中乱序数据达到】
            a. 本质:
                给数据流中每条数据加上时间戳timestamp,等于数据事件时间 - 允许最大乱序时间
            b. 功能:
                触发窗口计算,watermark-timestamp >= window-time 
    
        第2种方式:AllowedLateness 
            【当窗口数据触发计算以后,不要立即销毁窗口数据,保存到内存中一段时间,在时间范围内,窗口中延迟数据到达,依然触发窗口计算】
    
    
    3) 方案2:迟到数据直接放入到侧边流中,后续单独处理
        sideOutput
    

    ======================================================================================
    阿里巴巴,自从双11以后,实时大屏统计,技术变更:
    2017年之前:JStorm(Apache Storm)
    |
    |
    2017年开始:Blink(Apache Flink)
    |
    |
    主要原因:
    Apache Flink 流式计算时,属于状态计算,并且可以将状态自动保存,便于容灾恢复
    端到端精确性一次语义

    ======================================================================================
    实时项目面试题:
    [业务数据:每秒产生1800条数据,请问大数据集群规模怎么样?,如何规划呢?]
    集群机器多少
    每台机器配置如何(CPU CORE、内存Memory和Disk 硬盘)

    ======================================================================================
    Flink State状态:
    【Apache Flink® — Stateful Computations over Data Streams】
    1. 状态是什么
    State状态,指的是Job作业运行时,计算数据过程中,存储中间临时值,下一条数据处理时需要使用
    比如词频统计WordCount
    flink -> 1
    flink |
    flink -> 2 = 以前词频1 + 当前词频1 ,求和计算

    2. 类型划分:
        第1类:Operator State 算子状态
            Flink Stream Job -> Source Operator、Transformation Operator、Sink Operator 
                                                            |
                                                所有算子操作,都可以有状态
            常常作用于:Source 数据源
                比如从Kafka 队列topic中消费数据,3个分区数据消费,启动3个SubTask子任务消费
                    每次数据消费以后,需要保存消费偏移量,以便下次继续消费
                                    |
                            可以使用状态存储偏移量
            【每个Operator 算子实例,存储一个状态值State】
        
        第2类:KeyedState 键控状态
            KeyedStream分组流中每个Key都有一个状态,此时称为Key对应的状态为键控主干太
                比如词频统计WordCount中,每个单词都有一个状态State,存储对应的词频
        
    3. 存储数据结构
        单值存储:ValueState
        存储多个值:ListState,相当于1个列表
        存储KV集合:MapState,相当于Map集合映射或字典
        广播状态,底层依然是map集合:BroadcastState
        单值计算状态:
            ReducingState、AggregatingState、FoldingState
    
    4. 案例:KeyedState,键控状态案例
        分组后,处理每组中的数据时,定义状态,保存计算中间结果值
        实现功能:max算子功能,对数据流DataStream,指定分组key后,对每个组内数据获取指定字段的最大值
    

    相关文章

      网友评论

          本文标题:Flink_四大基石windows && Time

          本文链接:https://www.haomeiwen.com/subject/bikbgrtx.html