Flink CEP的 概述与分类
- Flink CEP的 概述
CEP 即Complex Event Processing即复杂事件处理,Flink CEP是在Flink种实现复杂事件处理的库。处理事件的规则被叫做Pattern,Flink CEP提供了Pattern API,用于对输入数据进行复杂事件的规则定义,用来提取符合规则的事件序列。 - 三种Pattern API: 个体模式,组合模式,模式组
- 应用:实时监控恶意登录,虚假交易。金融行业识别风险、营销广告等
Pattern API
Pattern分类
- 个体模式:个体模式包括单例模式和循环模式,单例模式只接收一个事件,而循环模式可以接受多个事件。
(1)量词
(2 ) 条件 .where,.or().until() utils可作为终止条件,以便清理状态
start.times(3).where(_.behavior.startsWirh('fav'))
start.oneOrTwo//出现1次或2次
start.timesOrMore(2).optional.greedy//匹配出现0、2或多次
- 组合模式
val start = Pattern.begin('start')
- 模式组: 将一个模式序列作为条件潜逃在一个个体里面,成为一组模式
模式序列
- 严格临近,所有时间按照严格的顺序出现,中间没有任何不匹配的事件,由.next()指定
- 宽松临近,允许中间出现不匹配的事件。由.followedby指定
- 非确定性宽松临近,表示之前已经匹配过的事件也可以再次使用,由.followedByAny 指定
- 不希望出现某种临近关系,比如.notNext()
- 所有模式必须以.begin()开始,模式序列不能以.notFollowedBy()结束,not类型的模式不能被optional所修饰,可以为模式指定时间约束,用来要求在多长时间内匹配有效
模式的检测
指定要查找的模式序列后,就可以将其应用于输入流以检测潜在匹配。调用CEP.pattern(),给定输入流和模式,就能得到一个PatternStream。PatternStream里面输出的是每次匹配成功以后,按模式输出的匹配流
val input:DataStream[Event] = ...
val pattern:Pattern[Event,_] = ...
val patternStream:PatternStream[Event]=CEP.pattern(input,pattern)
匹配事件的提取
创建PatternStream之后,就可以应用select或者flatSelect方法,从检测到的事件序列中提取事件,每个匹配成功的事件序列都会调用它。select()以一个selectfunction 作为参数,每个成功匹配的事件序列都会调用它。select()以一个Map[String,Iterable[IN]] 来接收匹配到的事件序列,其中key就是每个模式的名称,而value就是所有接收到的事件的Iterable类型。
def selectFn(pattern:Map[String,Iterable[IN]]):OUT={
val startEvent = pattern.get("start").get.next
val endEvent = pattern.get("end").get.next
OUT(startEvent,endEvent)
}
package com.lagou.mycep;
import org.apache.flink.api.common.eventtime.*;
import org.apache.flink.cep.CEP;
import org.apache.flink.cep.PatternStream;
import org.apache.flink.cep.functions.PatternProcessFunction;
import org.apache.flink.cep.pattern.Pattern;
import org.apache.flink.cep.pattern.conditions.IterativeCondition;
import org.apache.flink.streaming.api.TimeCharacteristic;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.util.Collector;
import java.util.List;
import java.util.Map;
public class LoginDemo {
public static void main(String[] args) throws Exception {
/**
* 1、数据源
* 2、在数据源上做出watermark
* 3、在watermark上根据id分组keyby
* 4、做出模式pattern
* 5、在数据流上进行模式匹配
* 6、提取匹配成功的数据
*/
StreamExecutionEnvironment env = StreamExecutionEnvironment