云服务器内容精选

  • Flink滑动窗口增强 本节主要介绍Flink滑动窗口以及滑动窗口的优化方式。 Flink窗口的详细内容请参见官网:https://ci.apache.org/projects/flink/flink-docs-release-1.12/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份。当窗口大小/滑动周期非常大时,冗余现象非常严重。 图1 窗口原始结构示例 假设一个数据在102秒时到来,它将会被分配到[85, 105)、[90, 110)、[95, 115)以及[100, 120)四个不同的窗口中。 窗口优化 针对上述SlidingEventTimeWindow和SlidingProcessingTimeWindow在保存原始数据时存在的数据冗余问题,对保存原始数据的窗口进行重构,优化存储,使其存储空间大大降低,具体思路如下: 以滑动周期为单位,将窗口划分为若干相互不重合的pane。 每个窗口由一到多个pane组成,多个pane对窗口构成了覆盖关系。所谓一个pane即一个滑动周期,如:在窗口window(SlidingEventTimeWindows.of(Time.seconds(20), Time.seconds.of(5)))中pane的大小为5秒,假设这个窗口为[100, 120),则包含的pane为[100, 105), [105, 110), [110, 115), [115, 120)。 图2 窗口重构示例 当某个数据到来时,并不分配到具体的窗口中,而是根据自己的时间戳计算出该数据所属的pane,并将其保存到对应的pane中。 一个数据仅保存在一个pane中,内存中只有一份。 图3 窗口保存数据示例 当需要触发某个窗口时,计算该窗口包含的所有pane,并取出合并成一个完整的窗口计算。 图4 窗口触发计算示例 当某个pane不再需要时,将其从内存中删除。 图5 窗口删除示例 通过优化,可以大幅度降低数据在内存以及快照中的数量。 父主题: Flink开源增强特性
  • SQL查询语法 通过MATCH_RECOGNIZE的SQL语法实现。MATCH_RECOGNIZE子句自Oracle Database 12c起由Oracle SQL支持,用于在SQL中表示事件模式匹配。Apache Calcite同样支持MATCH_RECOGNIZE子句。 由于Flink通过Calcite分析SQL查询结果,本操作遵循Apache Calcite语法。 MATCH_RECOGNIZE ( [ PARTITION BY expression [, expression ]* ] [ ORDER BY orderItem [, orderItem ]* ] [ MEASURES measureColumn [, measureColumn ]* ] [ ONE ROW PER MATCH | ALL ROWS PER MATCH ] [ AFTER MATCH ( SKIP TO NEXT ROW | SKIP PAST LAST ROW | SKIP TO FIRST variable | SKIP TO LAST variable | SKIP TO variable ) ] PATTERN ( pattern ) [ WITHIN intervalLiteral ] [ SUBSET subsetItem [, subsetItem ]* ] DEFINE variable AS condition [, variable AS condition ]* ) MATCH_RECOGNIZE子句的语法元素定义如下: -PARTITION BY [可选]:定义分区列。该子句为可选子句。如果未定义,则使用并行度1。 -ORDER BY [可选]:定义数据流中事件的顺序。ORDER BY子句为可选子句,如果忽略则使用非确定性排序。由于事件顺序在模式匹配中很重要,因此大多数情况下应指定该子句。 -MEASURES [可选]:指定匹配成功的事件的属性值。 -ONE ROW PER MATCH | ALL ROWS PER MATCH [可选]:定义如何输出结果。ONE ROW PER MATCH表示每次匹配只输出一行,ALL ROWS PER MATCH表示每次匹配的每一个事件输出一行。 -AFTER MATCH [可选]:指定从何处开始对下一个模式匹配进行匹配成功后的处理。 -PATTERN: 将匹配模式定义为正则表达式格式。PATTERN子句中可使用以下运算符: 连接运算符,量词运算符(*,+,?,{n},{n,}, {n,m}, {,m}),分支运算符(使用竖线‘|’),以及异运算符(‘{- -}’)。 -WITHIN [可选]:当且仅当匹配发生在指定时间内,则输出模式子句匹配。 -SUBSET [可选]:将DEFINE子句中定义的一个或多个关联变量组合在一起。 -DEFINE:指定boolean条件,该条件定义了PATTERN子句中使用的变量。 此外,还支持以下函数: -MATCH_NUMBER():可用于MEASURES子句中,为同一成功匹配的每一行分配相同编号。 -CLASSIFIER():可用于MEASURES子句中,以指示匹配的行与变量之间的映射关系。 -FIRST()和LAST():可用于MEASURES子句中,返回在映射到模式变量的行集的第一行或最后一行中评估的表达式的值。 -NEXT()和PREV():可用于DEFINE子句中,通过分区中的前一行或下一行来评估表达式。 -RUNNING和FINAL关键字:可用于确定聚合的所需语义。RUNNING可用于MEASURES和DEFINE子句中,而FINAL只能用于MEASURES子句中。 -聚合函数(COUNT,SUM,AVG,MAX,MIN):这些聚合函数可用于MEASURES子句和DEFINE子句中。