Flink学习2

4 Flink state

4.1 核心算法

理论假定:

  • 网络通道是可信的。一个FIFO的消息时可以被blocked和unblocked。当一个通道blocked,所有的消息将会被缓存,不被传递。当通道unblocked,则消息会继续传播。
  • task可以触发其通道的操作,比如block,unblock以及发送消息。也支持向所有的输出通道广播消息。
  • 源数据task通过Nil的输入通道注入消息。

ABS算法执行步骤如下:一个中心协调者周期的向所有源task注入阶段栅栏。当一个源task接收到栅栏,他将会为当前状态做一个快照,之后将栅栏消息光波导所有的输出通道(如图2)。当一个非源task从一个输入通道接收到栅栏消息,将会阻塞这个通道,直到所有的输入通道都接受到这个栅栏消息。这时,task会对当前的状态执行一个快照,并将栅栏消息广播到所有的输出通道。之后task将会unblock所有的输入通道,继续进行计算操作。全局快照 G ∗ = (T ∗ ,E ∗ )将会在所有的算子状态T都完成,且E=空的时候完成。

4.2 backend

  • MemoryStateBackend
    数据已java bean的方式存储在java heap中。key/value形式的数据存放在hash table中。state backend将会定期对数据做快照,将快照发送给JobManager。MemoryStateBackend可以配置使用异步快照。系统推荐使用异步快照,因为这样可以大幅降低通道阻塞。默认情况下是异步快照。
  • FsStateBackend
    将快照存放在文件系统中,例如hdfs,file。FsStateBackend将数据维护在内存中。当checkpoint时,才会做state snapshot,并将snapshot存入文件系统中。默认情况下采用异步快照。
  • RocksDBStateBackend
    需要为RocksDB配置文件系统路径,比如hdfs,file等。RocksDBStateBackend将state信息直接存放在DB中。当执行checkpoint,RocksDB将会做快照,并将snapshot信息存放到文件系统中。
    使用场景:Jobs with very large state, long windows, large key/value states.
    All high-availability setups.

5 Flink CEP

FlinkCEP是在Flink之上实现的复杂事件处理(CEP)库。 它允许你在无界的事件流中检测事件模式,让你有机会掌握数据中重要的事项。
随着数据量的增长以及智能设备持续收集越来越多的数据,对于不断增长的流数据的分析存在巨大的挑战。尤其是在对于变化趋势的实时响应,或者提供可能会导致公司成功或失败的商业信息等方面,这个问题尤为突出。
Flink通过使用CEP库来处理这些场景。CEP通过使用pattern和输入消息进行比对,从而实现了输入复杂消息的分析。与传统RDBMS相反,CEP在一个持久化的查询上执行相关数据,丢弃无关数据。这使CEP查询可以被应用于无线数据流上,且能够立即对输入的数据进行分析。在这个方面的影响下,CEP实时数据分析才能够真正运行。这让我们有机会快速把控数据中真实重要的数据。以此为依据,Flink CEP是Apache Flink生态圈重要的组成部分。

5.1 pattern循环方式

* pattern.oneOrMore(),用于期望一个或多个事件发生的模式(例如之前提到的b +)
* pattern.times(#ofTimes),用于期望给定类型事件的特定出现次数的模式,例如4个
* patterntimes(#fromTimes,#toTimes),用于期望给定类型事件的最小出现次数和最大出现次数的模式,例如, 2-4。
* pattern.greedy()方法使循环模式变得贪婪,但是还不能使组模式变得贪婪。
* pattern.optional()方法使得所有模式,循环与否,变为可选。

5.2 条件

pattern.where(),pattern.or()或pattern.until()方法指定事件属性的条件。 条件可以是IterativeConditions或SimpleConditions。
* 迭代条件。指定一个条件,该条件基于先前接受的事件的属性或其子集的统计信息来接受后续事件。
* 简单条件。这种类型的条件扩展了前面提到的IterativeCondition类,并且仅根据事件本身的属性决定是否接受事件。可以通过pattern.subtype(subClass)方法将接受事件的类型限制为初始事件类型的子类型。
* 组合条件。可以将子类型条件与其他条件组合使用。可以通过顺序调用where()来任意组合条件。
* 停止条件。在循环模式(oneOrMore()和oneOrMore().optional())的情况下,可以指定停止条件。
* 连续事件条件。
FlinkCEP支持事件之间以下形式进行连续:
严格连续性:希望所有匹配事件一个接一个地出现,中间没有任何不匹配的事件。
宽松连续性:忽略匹配的事件之间出现的不匹配事件。 不能忽略两个事件之间的匹配事件。
非确定性轻松连续性:进一步放宽连续性,允许忽略某些匹配事件的其他匹配。

5.3 skip

对于给定的一个pattern,一个相同的event可能被分配到多个成功的匹配上。为了控制event匹配的个数,需要通过AfterMatchSkipStrategy定义skip策略。当前有四种类型的策略:
* NO_SKIP:每个可能的匹配都会被触发。
* SKIP_PAST_LAST_EVENT:忽略所有的在开始和结束中间的局部匹配。
* SKIP_TO_FIRST:忽略第一个匹配元素的片段匹配。包含开始元素的匹配,只能是全局匹配。
* SKIP_TO_LAST:只有start的全局匹配和最后一个匹配。
skip接口:

FunctionDescription
AfterMatchSkipStrategy.noSkip()Create a NO_SKIP skip strategy
AfterMatchSkipStrategy.skipToNext()Create a SKIP_TO_NEXT skip strategy
AfterMatchSkipStrategy.skipPastLastEvent()Create a SKIP_PAST_LAST_EVENT skip strategy
AfterMatchSkipStrategy.skipToFirst(patternName)Create a SKIP_TO_FIRST skip strategy with the referenced pattern name patternName
AfterMatchSkipStrategy.skipToLast(patternName)Create a SKIP_TO_LAST skip strategy with the referenced pattern name patternName

5.4 超时数据处理

每当模式具有通过within关键字附加的时间窗口长度时,部分事件序列可能因为超出时间窗口长度而被丢弃。 为了对这些超时的部分匹配作出相应的处理,select和flatSelect API调用允许指定超时处理程序。
为每个超时的部分事件序列调用此超时处理程序。 超时处理程序接收到目前为止由模式匹配的所有事件,以及检测到超时时的时间戳。
为了处理部分模式,select和flatSelect API提供了一个带参数的重载版本
* PatternTimeoutFunction/ PatternFlatTimeoutFunction。
* OutputTag 超时的匹配将会在其中返回。
* PatternSelectFunction / PatternFlatSelectFunction。

demo

https://github.com/yunzhongniao/cep-monitoring

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值