Flink窗口本章节主要介绍滑动窗口,并提供滑动窗口优化方式。窗口的详细内容请参见官网:https://ci./projects/flink/flink-docs-release-1.7/dev/stream/operators/windows.html。 窗口介绍窗口中数据的保存形式主要有中间结果和原始数据两种,对窗口中的数据使用公共算子,如sum等操作时(window(SlidingEventTimeWindows.of(Time.seconds(20), Time.seconds(5))).sum)仅会保留中间结果;当用户使用自定义窗口时(window(SlidingEventTimeWindows.of(Time.seconds(20), Time.seconds(5))).apply(new UDF))时保存所有的原始数据。 用户使用自定义SlidingEventTimeWindow和SlidingProcessingTimeWindow时,数据以多备份的形式保存。假设窗口的定义如下: window(SlidingEventTimeWindows.of(Time.seconds(20), Time.seconds(5))).apply(new UDFWindowFunction) 当一个数据到来时,会被分配到20/5=4个不同的窗口中,即:数据在内存中保存了4份。当窗口大小/滑动周期非常大时,冗余现象非常严重,难以接受。 图4-1 窗口原始结构示例 假设一个数据在102秒时到来,它将会被分配到[85, 105)、[90, 110)、[95, 115)以及[100, 120)四个不同的窗口中。 窗口优化针对上述SlidingEventTimeWindow和SlidingProcessingTimeWindow在保存原始数据时存在的数据冗余问题,对保存原始数据的窗口进行重构,优化存储,使其存储空间大大降低,具体思路如下:
通过优化,可以大幅度降低数据在内存以及快照中的数量。 Job Pipeline
Job Pipeline流图结构Pipeline是由Flink的多个Job通过TCP连接起来,上游Job可以直接向下游Job发送数据。这种发送数据的流图称为Job Pipeline,如图4-6所示。 Job Pipeline原理介绍图4-7 Job Pipeline原理图
功能介绍
Job与Job之间的联系可能是多对多的关系,对于每个NettySink和NettySource算子的并发度而言,是一对多的关系,如图4-8所示。 配置表在某些场景下,用户存在固定的配置表,存储了基础信息;当平台接收流数据并处理时,需要与配置表进行匹配操作。由于配置表可能较大,考虑使用Redis存储,Redis是一个高性能的key-value数据库,流数据查询时延较低。 具体流程如下: 图4-9 流程图 Redis存储数据Redis并不是简单的key-value存储,实际上它是一个数据结构服务器,支持不同类型的值。支持数据类型存储如下:
为满足最大5亿条数据配置表的存储并及时响应查询,使用Redis集群存储配置表,并使用流的异步IO作消息查询,提高数据处理的吞吐量。
涉及Redis主要有两部分,Redis安装部署以及配置表数据导入:
Redis数据类型详细信息请参见官网:https:///topics/data-types-intro。 Flink异步IO当与外部系统进行交互时,如外部的数据库,访问等待时间过长导致数据处理效率低。异步IO实现了不需要等待请求返回就可以同时发送其他请求,以此提高数据吞吐量。 异步IO的API实现需要注意三点:
Stream SQL JoinFlink的Table API&SQL是一种用于Scala 和Java的语言集成式查询API, 它支持非常直观的从关系运算符 (如选择、筛选和连接)进行组合查询。Table API&SQL详细内容请参加官网:https://ci./projects/flink/flink-docs-release-1.7/dev/table/index.html。 Stream SQL Join介绍SQL Join用于根据两个或多个表中的列之间的关系,从这些表中查询数据。Flink Steam SQL Join允许对两个流式table进行join,并从中查询结果。支持类似于以下内容的查询: SELECT o.proctime, o.productId, o.orderId, s.proctime AS shipTime FROM Orders AS o JOIN Shipments AS s ON o.orderId = s.orderId AND o.proctime BETWEEN s.proctime AND s.proctime + INTERVAL '1' HOUR; 目前,Stream SQL Join需在指定的窗口范围内进行。对窗口范围内的数据进行连接,需要至少一个相等连接谓词和一个绑定双方时间的条件。这个条件可以由两个适当的范围谓词 (<, <=, >=, >),一个BETWEEN谓词或者一个单一的相等谓词来定义。 这个相等谓词主要是比较两个输入表的同类型时间属性(比如处理时间或者事件时间)。 以下是一个关于在收到订单后四小时内发货, 将所有订单及其相应的货件进行Join的示例: SELECT *FROM Orders o, Shipments sWHERE o.id = s.orderId ANDo.ordertime BETWEEN s.shiptime - INTERVAL '4' HOUR AND s.shiptime
|
|
来自: sztonydwnajpqa > 《待分类》