1.Flink SQL 窗口聚合详解
2.Flink Sink的指指标反压优化(Sink异步化)
3.Flink 精选如何分析及处理反压?
4.flink窗口的种类及详述
5.Flink 时间窗口全解析!(建议收藏)
6.Flink技术简介与入门
Flink SQL 窗口聚合详解
滚动窗⼝(TUMBLE)定义:TUMBLE 窗口将每个元素分配给具有固定大小的标源窗口,这些窗口不重叠。计算若设定窗口大小为5分钟,指指标Flink会每隔5分钟开启一个新的标源窗口,每条数据只划分到一个5分钟的计算wdoc文件源码窗口中。
应用场景:按分钟聚合数据,指指标计算每分钟的标源PV和UV。实际案例:分维度分钟级别统计在线用户数、计算总销售额。指指标
滚动窗窗口在 Flink 1. 版本前和后分别有 Group Window Aggregation 和 Windowing TVF 实现方式。标源
Group Window Aggregation 方案(支持 Batch\Streaming 任务):在 SQL 的计算 GROUP BY 子句中声明 TUMBLE window,例如 tumble(row_time,指指标 interval '1' minute),其中 row_time 是标源事件时间的时间戳,interval '1' minute 是计算窗口大小。
Window TVF 方案(仅支持 Streaming 任务):在数据源的 Table 子句中声明 TUMBLE window,包括:TABLE source_table 声明数据源表,DESCRIPTOR(row_time) 声明数据源的时间戳字段,INTERVAL '' SECOND 声明窗口大小为1分钟。
实时场景 SQL 语义:假设 Orders 为 Kafka,target_table 也为 Kafka,生成的实时任务执行时,会产生三个算子:数据源算子(From Order),连接到 Kafka topic,实时读取数据,发送至下游窗口聚合算子;窗口聚合算子(TUMBLE 算子),接收数据并按时间戳划分至对应窗口;数据汇算子(INSERT INTO target_table),接收数据并写入到 target_table Kafka 中。
注意:事件时间中滚动窗口的计算触发由 Watermark 推动。
滑动窗窗口(HOP)定义:滑动窗口将元素分配给固定长度的窗口,有窗口大小的概念,不同之处在于滑动窗口具有滑动步长参数,如果步长小于窗口大小,则窗口之间可以重叠,一条数据可能分配到多个窗口。
应用案例:计算同时在线用户数,每分钟输出一次,计算过去5分钟的数据。
滑动窗窗口在 Flink 1. 版本中通过 Group Window Aggregation 和 Windowing TVF 方案实现。
Group Window Aggregation 方案(支持 Batch\Streaming 任务):在 GROUP BY 子句中声明滑动窗口,机构打板源码包含事件时间的时间戳字段、滑动步长和窗口大小。
Windowing TVF 方案(仅支持 Streaming 任务):在数据源的 Table 子句中声明滑动窗口,包括 TABLE source_table 声明数据源表、DESCRIPTOR(row_time) 声明数据源的时间戳、INTERVAL '1' MINUTES 和 INTERVAL '5' MINUTES 分别声明滑动步长和窗口大小。
Session 窗口定义:Session 时间窗口不同于滚动和滑动窗口,没有固定持续时间,如果在定义的间隔内没有新数据出现,则 Session 窗口关闭。
实际案例:计算每个用户在活跃期间(一个 Session)购买的商品数量,如果用户5分钟内没有活动,则 Session 结束。
Flink SQL 1. 版本中仅支持 Group Window Aggregation 方案的 Session 窗口。
Group Window Aggregation 方案(支持 Batch\Streaming 任务):Session 窗口声明写在 GROUP BY 子句中,包含事件时间的时间戳和 Session gap 间隔。
渐进式窗口(CUMULATE)定义(仅支持 Streaming 任务):渐进式窗口首先创建一个最大窗口大小的滚动窗口,然后根据用户设置的触发时间间隔将其拆分为多个具有相同窗口起点和不同窗口终点的窗口。
示例:绘制从每日常规到当前分钟的累积 UV,: 时的 UV 表示从 : 到 : 的 UV 总数。
应用场景:周期内累计 PV、UV 指标(如每天累计至当前分钟的 PV、UV),这类指标是周期内的累计状态。
实际案例:每天截止当前分钟的累计 money(sum(money))、去重 id 数(count(distinct id)),渐进式窗口大小为1天,移动步长为分钟级别。
明细输入数据:预期输出数据,每分钟的输出结果都是当天零点累计到当前的结果,渐进式窗口仅支持 Windowing TVF 方案。
Windowing TVF 方案(仅支持 Streaming 任务):在数据源的 Table 子句中声明 CUMULATE window,包括:TABLE source_table 声明数据源表、DESCRIPTOR(row_time) 声明数据源的时间戳、INTERVAL '' SECOND 声明触发步长为1分钟、INTERVAL '1' DAY 声明窗口大小为1天。
Window TVF 支持 Grouping Sets、Rollup、Cube 应用场景:多个维度组合计算,平台php源码扣分Grouping Sets 将维度组合写在一条 SQL 中,方便且执行效率高,仅在 Window TVF 中支持。
示例:计算每日常规累计到当前分钟的汇总、age、sex、age+sex 维度的用户数。
Flink SQL 中 Grouping Sets 语法与 Hive SQL 有所不同,使用 Hive SQL 实现上述 SQL 的语义,如下所示:
Flink Sink的反压优化(Sink异步化)
在Flink项目中,我们面临一个场景,即从阿里SLS接收监控指标并进行清洗,然后写入TSDB。起初运行平稳,但在指标数量增加后,发现SLS消费存在延迟问题。因此,我们着手优化Sink的异步处理。
问题的起因和定位涉及到了Sink的同步写入策略。原设计中,每接收到一条数据,Sink就立即同步调用TSDB接口,导致性能受限。为提升效率,我们需要将Sink的处理逻辑转变为异步模式。
异步优化的关键在于引入一个比喻,就像组织会议:首先确定参会者,只有当所有人都到位(即await()方法调用完成)时,会议才能开始。在Flink中,我们通过设置一个栅栏计数器来模拟这个过程,当处理任务(SinkTaskProcessor)完成一个数据写入请求,计数器减一,直到所有任务完成,数据才会被真正写入TSDB。
SinkTaskProcessor是用户必须实现的接口,负责处理数据写入。而AbstractAsyncRichSinkFunction作为抽象类,继承了RichSinkFunction并实现了CheckpointedFunction。女神学园 源码AsyncSinkTaskRunnable则是提交到线程池的任务,它负责从数据缓存队列中取出数据,并交给SinkTaskProcessor处理,同时设置了ms的超时防止阻塞。
源代码位于cn.sh.flink.learning.sink.async包下的SlowlyRickSinkTestFunction,这是一个模拟处理耗时任务的类,真正的数据处理工作由SinkTaskProcessor负责。我们鼓励大家试用并提供反馈,如果发现任何问题或有改进意见,欢迎通过私信或issue进行交流。
Flink 精选如何分析及处理反压?
阐述Flink、Storm,Spark Streaming 的反压机制,Flink 如何定位及分析反压?概念
反压(backpressure)是流式计算中常见的问题,表示数据管道中某个节点成为瓶颈,处理速率跟不上上游发送数据的速率,从而需要对上游进行限速。由于实时计算应用通常使用消息队列进行生产端和消费端的解耦,消费端数据源是 pull-based 的,所以反压通常从某个节点传导至数据源并降低数据源(例如 Kafka consumer)的摄入速率。
节点性能瓶颈可能是由于机器故障(网络、磁盘)、网络延迟和磁盘不足、频繁 GC、数据热点等原因。
反压的影响
反压并不会直接影响作业的可用性,但表明作业处于亚健康状态,有潜在的性能瓶颈并可能导致更大的数据处理延迟。对于规模较大的 Flink 作业,反压可能会导致严重问题。
Flink、Storm、Spark Streaming 反压机制对比
网络流控的实现:动态反馈/自动反压
Consumer 需要及时给 Producer 做一个反馈,告知其能够承受的速率。动态反馈分为负反馈(接受速率小于发送速率时,告知降低发送速率)和正反馈(发送速率小于接收速率时,告知可以提提速)。
Flink 反压机制
1. 数据交换:通过算子链串联多个算子,避免序列化和网络通信开销。maven源码怎么配置
2. 反压机制:在 Flink 1.5 版本之前采用基于 TCP 的流控机制,而在之后引入了基于信用(Credit-based)的反馈机制。
3. TCP 基于滑动窗口实现网络流控,通过接收端的 ACK 和窗口大小反馈限制发送速率。
Storm 反压机制
Storm 在每个 Bolt 中都有一个监控反压的线程,检测接收队列阻塞并控制发送速率以匹配接收速率。
Spark Streaming 反压机制
组件 RateController 监听并根据前一批次数据处理情况动态调整后续数据摄入量。
Flink 如何定位反压节点
1. Flink Web UI 反压监控:通过线程堆栈信息和缓冲区请求阻塞数量计算反压率,定位反压的根源节点。
2. Flink Task Metrics 监控:利用网络和 I/O 指标分析 Subtask 的发送端和接收端 Buffer 占用率,间接定位反压节点。
Flink 如何分析反压
1. 数据倾斜分析:通过 SubTask 的 Records Sent 和 Record Received 指标,以及 State size 检测数据倾斜。
2. 用户代码执行效率:分析 CPU 使用情况,定位函数调用瓶颈。
3. TaskManager 内存与 GC:监控内存分配和 GC 行为,优化内存管理和垃圾回收策略。
flink窗口的种类及详述
1. 滚动窗口(Tumbling Window): 将事件分配到长度固定且互不重叠的桶中。
实际案例:简单且常见的分维度分钟级别同时在线用户数、总销售额。
Java设置语句:window(TumblingProcessingTimeWindows.of(Time.seconds(5)))
该语句为设置滚动窗口的窗口时长为5秒钟。
SQL设置语句:FROM TABLE(TUMBLE(TABLE source_table, DESCRIPTOR(row_time), INTERVAL '' SECOND))
2. 滑动窗口(Sliding Window): 分配器将每个元素分配到固定窗口大小的窗口。与滚动窗口分配器类似,窗口的大小由window size参数配置。还有一个window slide参数用来控制滑动窗口的滑动大小。因此,如果滑动大小小于窗口大小,则滑动窗口会重叠。在这种情况下,一个元素会被分配到多个窗口中。
实际案例:简单且常见的分维度分钟级别同时在线用户数,1分钟输出一次,计算最近5分钟的数据。
Java设置语句:window(SlidingProcessingTimeWindows.of(Time.seconds(), Time.seconds(5)))
window size:窗口大小为秒钟
window slide:窗口间隔为5秒钟
SQL设置语句:HOP(row_time, INTERVAL '1' MINUTE, INTERVAL '5' MINUTE)
3. 会话窗口(Session Window): 分配器通过活动会话对元素进行分组。与滚动窗口和滑动窗口相比,会话窗口不会重叠,也没有固定的开始和结束时间。当会话窗口在一段时间内没有接收到元素时会关闭。会话窗口分配器需要配置一个会话间隙,定义了所需的不活动时长。当此时间段到期时,当前会话关闭,后续元素被分配到新的会话窗口。
实际案例:计算每个用户在活跃期间(一个Session)总共购买的商品数量,如果用户5分钟没有活动则视为Session断开。
设置语句:基于事件时间的会话窗口window(EventTimeSessionWindows.withGap(Time.minutes()))
基于处理时间的会话窗口Java设置:window(ProcessingTimeSessionWindows.withGap(Time.minutes()))
会话间隙,不活动时长为秒钟
SQL设置:SESSION(row_time, INTERVAL '5' MINUTE)
4. 渐进式窗口(Incremental Window): 其实就是固定窗口间隔内提前触发的滚动窗口,其实就是Tumble Window + early-fire的一个事件时间的版本。例如,从每日零点到当前这一分钟绘制累积UV,其中:时的UV表示从:到:的UV总数。渐进式窗口可以认为是首先开一个最大窗口大小的滚动窗口,然后根据用户设置的触发的时间间隔将这个滚动窗口拆分为多个窗口,这些窗口具有相同的窗口起点和不同的窗口终点。
应用场景:周期内累计PV,UV指标(如每天累计到当前这一分钟的PV,UV)。这类指标是一段周期内的累计状态,对分析师来说更具统计分析价值,而且几乎所有的复合指标都是基于此类指标的统计(不然离线为啥都要累计一天的数据,而不要一分钟累计的数据呢)。
实际案例:每天的截止当前分钟的累计money(sum(money)),去重id数(count(distinct id))。每天代表渐进式窗口大小为1天,分钟代表渐进式窗口移动步长为分钟级别。
SQL设置:FROM TABLE(CUMULATE(TABLE source_table, DESCRIPTOR(row_time), INTERVAL '' SECOND, INTERVAL '1' DAY))
5. 全局窗口(Global Window): 分配器将具有相同key的所有元素分配给同一个全局窗口。仅当我们指定自定义触发器时,窗口才起作用。否则,不会执行任何计算,因为全局窗口没有我们可以处理聚合元素的自然结束的点。
平时滑动窗口用得比较多,其次是滚动窗口。
Flink 时间窗口全解析!(建议收藏)
Flink时间窗口解析详解: 首先,时间窗口的核心在于时间定义,比如1分钟窗口,即数据在特定时间范围内被处理。Flink对时间有三种理解: 事件发生的时间,比如用户点击链接的时刻。 节点接收数据的时间,如Source从Kafka读取数据的那一刻。 Operator处理数据的时间,即timeWindow接收到数据的时刻。 从Flink 1.版本开始,EventTime被默认作为时间标准,它基于事件产生时设备上的时间,但处理时会受延迟和乱序影响,但有利于统计实时数据指标和处理乱序事件。 相比之下,ProcessingTime是数据在Operator处理时的系统时间,虽有最佳性能和低延迟,但无法准确反映数据产生时的实时变化,因为Flink分布式环境会引入延迟。 IngestionTime则是数据进入Flink的时间,如Kafka消费操作的完成时间,它介于EventTime和ProcessingTime之间,对无序事件处理有限,Flink会自动管理时间戳和水位线。Flink技术简介与入门
Flink 是一个分布式流处理和批处理计算框架,以其高性能、容错性和灵活性著称,广泛应用于实时数据处理、数据湖分析、事件驱动应用等场景。Flink 的架构设计使其能够实现高效的数据流处理与任务调度。
架构包含 JobManager 和 TaskManager,二者通过心跳机制和RPC(远程过程调用)进行通信。JobManager 集中管理任务调度与监控,而 TaskManager 在集群中负责具体任务执行。集群中可以配置多个 TaskManager 与一个 JobManager 协同工作,实现数据处理的高效率与可伸缩性。
在与其他大数据组件集成方面,Flink 提供了流式计算与窗口函数原理支持。常见的窗口函数有滚动窗口、滑动窗口、会话窗口与全局窗口,分别适用于不同场景的数据分组与聚合操作。这些窗口函数与其它操作符如groupBy()、reduce()、aggregate()等结合使用,可以实现灵活的数据处理与分析。
对于读取 Kafka 数据并计算指标,Flink 提供了 Java 和 Python 代码示例,简化了从 Kafka 消费数据并进行指标计算的过程。加载数据湖进行 AI 模型训练时,Flink 与数据湖集成,通过流式处理和批处理结合,有效处理多媒体数据,适用于风控等应用场景。Flink 的批处理 API 与机器学习库(如 Apache Flink ML、Apache Mahout)结合,提供了一个简单的示例,展示如何在 Flink 中使用批处理 API 进行线性回归模型的训练。
Flink Table API 是 Flink 提供的高级 API,以类 SQL 的声明性编程方式处理结构化数据,简化了数据查询、转换、聚合等操作。通过 Table API,用户可以更高效地进行数据处理,无需编写复杂的低级别代码。
Flink 在发展过程中不断优化,以其独特优势在市场中脱颖而出,包括高性能、低延迟、容错机制、统一的处理模型、以及强大的生态系统支持。Flink 通过持续创新,为大数据处理、实时分析与机器学习应用提供了强大而灵活的解决方案。
面试实时开发必问——Flink中如何做流Join呢?
自从Stream pipeline解决方案的成熟,流操作与关系型表结构操作的差距越来越小了。我们通过Flink这样的框架,可以进行高吞吐量的数据流执行非常密集的数据处理,例如:join、filter、aggregation。接下来,我们将深入了解Flink的Stream join功能。
在介绍Stream join之前,我们先回顾一下关系型数据的Join以及数仓维度建模的Join。在关系型数据库中,通过JOIN将多个表的数据集中起来,以满足数据的关联需求。MySQL支持多种JOIN,如LEFT JOIN、RIGHT JOIN、INNER JOIN,每种JOIN具有其独特的应用特性。
在数据仓库设计中,通常采用维度建模方式,事实表与维表通过外键ID关联,利用维表的ID统计计算指标。这正是实时数据处理中的需求,即事实数据(Event)需要与外部存储系统中的数据进行关联,以获取完整数据。在实时处理场景下,流处理系统需要关联数据以实现完整数据的实时处理。
实现这一目标的方式之一是Flink的流JOIN操作。Flink的流JOIN主要分为两种类型:Window Join和Interval Join。下面我们重点介绍Window Join。
Window Join将流中具有相同key的元素联结在一起,类似于INNER JOIN,要求两个元素都存在才进行联结。Flink中包含滚动窗口、滑动窗口和会话窗口三种典型窗口类型。执行窗口join时,将所有在同一个滚动窗口内能够匹配上、且具有相同key的事件进行联结,并传递到JoinFunction或FlatJoinFunction。这种联结方式类似于INNER JOIN,滚动窗口operator不会将在流中存在而在另一个流中不存在的元素发送到下游。
例如,使用两个流模拟数据,一个流表示订单明细,另一个流表示商品数据。通过滚动窗口join,将数据关联在一起,实现基于商品ID的关联操作。
在实际应用中,首先导入Flink依赖,构建实体类以表示商品和订单明细,构建数据源并设置水印分配器,最后使用Window Join代码实现数据关联,设置窗口大小和关联方法,实现流与流之间的有效联结。
另一种方式是Interval Join,它允许在没有窗口限制的情况下进行元素联结。Interval Join同样使用相同的key来联结两个流,且流B中的元素时间戳与流A元素的时间戳之间存在时间间隔,即流B元素时间戳大于流A元素时间戳加上下界,同时小于加上上界。这种联结方式适用于没有固定窗口需求的场景,且只支持INNER JOIN。
在使用Interval Join时,首先使用keyBy将两个流关联在一起,设置流A去关联哪个时间范围的流B元素,并在process方法中将具有相同key的元素关联起来,生成新的FactOrderItem对象。
本文旨在提供Flink中流JOIN操作的深入理解,通过实际案例和代码实现,帮助读者在实时数据处理中实现高效数据关联。了解更多细节和具体实现,请参考官方文档。