赞
踩
Flink是一个分布式流处理框架,具有高性能、高可靠性和可扩展性。Flink支持实时和批处理,可以处理无限数据流和有限数据集。它提供了丰富的API和工具,可以方便地进行数据转换、聚合、过滤、窗口计算等操作。Flink还支持多种数据源和数据接收器,包括Kafka、HDFS、Elasticsearch等。Flink的运行模式包括本地模式和分布式模式,可以在各种环境中部署和运行。Flink已经被广泛应用于大数据分析、实时监控、智能推荐等领域。
Flink的数据处理基础是数据流,它是一种连续的、无限的数据集合。数据流可以是从文件、消息队列、套接字等数据源中获取的实时数据,也可以是有限的、批处理的数据集。Flink的DataStream API支持对数据流进行各种操作和转换。
在流处理中,通常需要将数据按照时间或者其他维度进行切分,形成一个个的数据片段,这些数据片段就是窗口。Flink支持多种窗口类型,例如滚动窗口、滑动窗口、会话窗口等,可以根据需要选择合适的窗口类型进行数据处理。
时间是Flink数据流处理中的重要概念,它用于对数据流进行切分、聚合、计算等操作。Flink支持多种时间类型,例如事件时间、处理时间、摄入时间等。
算子是Flink数据流处理中的基本操作单元,可以对数据流进行各种转换、聚合、过滤、连接等操作。Flink提供了多种算子,例如map、filter、reduce、join等。
状态是Flink数据流处理中的重要概念,它用于保存和更新数据流中的状态信息。例如,对于滑动窗口中的数据,需要保存前一段窗口的状态信息,以便进行增量计算。Flink支持多种状态类型,例如键值状态、列表状态、聚合状态等。
在Flink中,水位线是一种衡量Event Time进展的机制,用来处理实时数据中的乱序问题的,通常是水位线和窗口结合使用来实现。
从设备生成实时流事件,到Flink的source,再到多个oparator处理数据,过程中会受到网络延迟、背压等多种因素影响造成数据乱序。在进行窗口处理时,不可能无限期的等待延迟数据到达,当到达特定watermark时,认为在watermark之前的数据已经全部达到(即使后面还有延迟的数据), 可以触发窗口计算,这个机制就是 Watermark(水位线),具体如下图所示。
①作用:作为衡量事件时间进展的标记;
②产生:从数据中提取时间戳,作为水位线的时间戳;
③特征:广播到下游,确保所有并行子任务都可以及时更新事件时间,进行窗口计算
所有数据按照事件发生时间,依次进入流,遵循先来后到原则。从每条数据提取的时间戳由小到大。
数据发生时间与进入流时的顺序不一致
1、都是周期生成的: 默认200ms
2、有序流:watermark = 当前最大事件时间 - 1ms
3、乱序流:watermark = 当前最大时间 - 延迟时间 - 1ms
有序流:WatermarkStrategy.forMonotonousTimestamps()
乱序流:WatermarkStrategy. forBoundedOutOfOrderness()
自定义:implements WatermarkGenerator
上游并行子任务发来不同的水位线,当前任务会为每一个分区设置一个“分区水位线”(Partition Watermark),这是一个分区时钟;而当前任务自己的时钟,就是所有分区时钟里最小的那个;
空闲等待方法:withIdleness()
将无限数据切割成有限的“数据块”进行处理,串口是处理无界流的核心。
窗口更像一个“桶”,将流切割成有限大小的多个存储桶,每个数据都会分发到对应的桶中,当到达窗口结束时间时,就对每个桶中收集的数据进行计算处理。
时间窗口以时间点到来定义窗口的开始(start)和结束(end),所以截取出的就是某一时间段的数据。到达时间时,窗口不再收集数据,触发计算输出结果,并将窗口关闭销毁。
窗口大小 = 结束时间 - 开始时间
基于元素的个数来截取数据,到达固定的个数时就触发计算并关闭窗口。
计数窗口理解简单,只需指定窗口大小,就可以把数据分配到对应的窗口中,Flink内部对应的类来表示计数窗口,底层通过全局窗口(Global Window)实现
滚动窗口有固定的大小,是一种对数据进行“均匀切片”的划分方式,首尾相接。我们之前所举的例子都是滚动窗口,也正是因为滚动窗口无缝衔接,所以每个数据都会被分配到一个窗口,而且只会属于一个窗口。
滚动窗口可以基于时间定义,也可以基于数据个数定义;需要的参数只有窗口大小,我们可以定义一个长度为1小时的滚动时间窗口,那么每个小时就会进行一次统计;或者定义一个长度为10的滚动计数窗口,就会每10个数进行一次统计
例:
滑动窗口的大小固定,但窗口之间不是首尾相接,而有部分重合。滑动窗口可以基于时间定义、数据个数。
定义滑动窗口的参数与两个:窗口大小,滑动步长。滑动步长是固定的,且代表了两个个窗口开始/结束的时间间隔。数据分配到多个窗口的个数 = 窗口大小/滑动步长
例:
每10秒钟计算前1分钟的页面浏览量
SlidingEventTimeWindows.of(Time.minutes(1), Time.seconds(10))
会话窗口只能基于时间来定义,“会话”终止的标志就是隔一段时间没有数据来。
size:两个会话窗口之间的最小距离。我们可以设置静态固定的size,也可以通过一个自定义的提取器(gap extractor)动态提取最小间隔gap的值。
在Flink底层,对会话窗口有比较特殊的处理:每来一个新的数据,都会创建一个新的会话窗口,然后判断已有窗口之间的距离,如果小于给定的size,就对它们进行合并操作。在Winodw算子中,对会话窗口有单独的处理逻辑。
会话窗口的长度不固定、起始和结束时间不确定,各个分区窗口之间没有任何关联。会话窗口之间一定是不会重叠的,且会留有至少为size的间隔
例:
相同key的所有数据都分配到一个同一个窗口中;无界流的数据永无止境,窗口没有结束的时候,默认不做触发计算,如果希望对数据进行计算处理,还需要自定义“触发器”(Trigger)
一个窗口在第一个属于它的元素到达时就会被创建,然后在时间(event 或 processing time) 超过窗口的“结束时间戳 + 用户定义的 allowed lateness
”时关闭删除
乱序:接收到的数据顺序和生成的数据的时间顺序不一致
迟到:超过了处理时间到达的数据
如果watermark等待3s,窗口允许迟到2s,为什么不直接watermark等待5s,或者窗口允许迟到5s
watermark设置太大会影响计算延迟
窗口允许迟到,是对大部分迟到数据的处理,让数据尽量准确
总结:在不影响计算时间的情况下,尽量保证数据的准确,修正数据
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。