Flink知识点概述

flink是什么

        是一个框架和分布式处理引擎,在无边界和有边界数据流上纪念性有状态的计算

主要特性

    1.批流统一

            批处理:数据 全部访问完成进行操作
                         有界、持久、大量,适合访问全套记录才能完成的工作,一般用于 离线统计
            流处理: 来一条数据处理一条数据
                         无界、实时,不需要操作整个系统
            无界流(Datastream):只有开始,没有结束,要以特定的顺序获取,并且获取后立即处理
            有界流(DataSet):开始结束都有,数据全部获取后执行, 可以被排序

     2.性能卓越

            高吞吐:同时处理大量数据
              低延时:快速返回结果

    3.规模计算

            支持超大状态与增量检查点机制
              状态:计算过程中需要存储的数据
              检查机制:备份

    4.生态兼容

                支持与yarn集成
                支持与kubernetes集成
                支持单机模式运行

    5.高容错

                故障自动重试
                        一致性检查点
                        保证故障场景下精确一次的状态一致性

并行度

                一个算子的子任务的个数被称为其并行度
                包含并行任务的数据流,就是并行数据流
                一个流程序的并行度,可以认为就是其所有算子中最大的并行度

设置并行度

     stream.map(word -> Tuple2.of(word, 1L)). setParallelism(2)
     或
      env.setParallelism(2)

窗口分类

         1)按照驱动分类

                    (1)时间窗口:时间定义起始
                    (2)计数窗口:达到指定个数
Flink知识点概述_第1张图片

            2)按照窗口分配数据的规则分类

                    (1)滚动窗口
                                            窗口内大小相同,不会有重叠,首尾相连 如:123,456,789
                    (2)滑动窗口
                                            窗口内大小相同,有重叠,首尾不相连 如:123,234,345
                    (3)会话窗口:基于时间定义
                                            会话超时时间,两个会话窗口之间的最小距离,窗口长度、起始时间不确定,窗口之间无关联,不重叠
                    (4)全局窗口:窗口没结束时,不会做触发计算

窗口API

            1)按键分区(Keyed Windows)

                        stream.keyBy(...).window(...)

            2)非按键分区(Non-Keyed Windows)

                         stream.windowAll(...)

代码中窗口API的调用

            窗口操作主要有两个部分:窗口分配器(Window Assigners)和窗口函数(Window Functions)。

                stream.keyBy()
                               .window()
                               .aggregate()

时间窗口

                时间窗口的计算频次
                时间窗口的大小
                时间窗口内的数据的处理逻辑

时间窗口计算模型的处理机制

Flink知识点概述_第2张图片
输入数据流----------->时间窗口计算----------->输出数据流

时间语义

        事件时间(Event Time):数据产生的时间
        处理时间(Processing Time):数据真正被处理的时间
        进入Flink的时间:(Ingestion Time):每个事件将进入Flink时的时间作为时间戳
        时间语义: 是以事件时间还是处理时间进行计算 
// TODO 1.指定窗口分配器: 指定 用 哪一种窗口 --- 时间 or 计数? 滚动、滑动、会话?
// 1.1 没有keyby的窗口: 窗口内的 所有数据 进入同一个 子任务,并行度值只能为1
//sensorDS.windowAll();
// 1.2 有keyby的窗口()
//sensorKS.window();每个key上都定义了一组窗口,各自独立地进行统计计算
//sensorKS.window();

基于时间

                

                滚动窗口,窗口长度10秒

sensorKS.window(TumblingProcessingTimeWindows.of(Time.seconds(10)));

                滑动窗口,长度10秒,步长2秒

sensorKS.window(SlidingProcessingTimeWindows.of(Time.seconds(10),Time.seconds(2)));

                会话窗口,超过五秒没数据,自动生成新的窗口

sensorKS.window(ProcessingTimeSessionWindows.withGap(Time.seconds(5)));

基于计数 数据条数

                窗口长度为5

sensorKS.countWindow(5);

                窗口长度为5 步长2

sensorKS.countWindow(5,2);

                全局窗口 计数窗口底层用这个 需自定义触发器使用

                        sensorKS.window(GlobalWindows.create())

水位线(Watermark)(水印)

        衡量事件时间进展的标记

水位线特性

                是插入到数据流中的一个 标记,可以认为是一个 特殊的数据
                主要内容是一个时间戳, 表示当前事件时间的进展
                 基于数据的时间戳生成的
                必须 单调递增
                设置 延迟,保证正确 处理乱序数据
一个水位线watermark(t) ,表示当前流中事件时间已达到时间戳,表示t之前的所有数据已到齐,不会有t1<=t
          有序流中的水位线:按生成的先后顺序进入流中,每条数据产生一个水位线
                                        数据量大时,每隔一段时间生成一个水位线
          乱序流中的水位线:因网络传输延迟,使顺序改变
                                        判断是否比前面的小,小则进入,否则进入新的
          
Flink知识点概述_第3张图片
Flink知识点概述_第4张图片

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