0


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)计数窗口:达到指定个数 

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(<key selector>)
                            .window(<window assigner>)
                            .aggregate(<window function>)

时间窗口

              时间窗口的计算频次 

              时间窗口的大小 

              时间窗口内的数据的处理逻辑 

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

输入数据流----------->时间窗口计算----------->输出数据流

时间语义

      事件时间(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 大数据

本文转载自: https://blog.csdn.net/roi666/article/details/135656936
版权归原作者 内向仓鼠 所有, 如有侵权,请联系我们删除。

“Flink知识点概述”的评论:

还没有评论