Flink CEP

Flink CEP 简介

什么是CEP

CEP指复杂事件处理(Complex Event Processing),他可以在无休止的事件流中通过一定的规则匹配检测事件模式,然后输出满足规则的复杂事件,用于掌握数据中重要部分。

CEP的特点

在这里插入图片描述

  • 目标:从有序的简单事件流中发现一些高阶特征

  • 输入:一个或多个由简单事件构成的事件流

  • 处理:识别简单事件之间的内在联系,多个符合一定规则的简单事件构成复杂事件

  • 输出:满足规则的复杂事件

Pattern API

Flink CEP提供了Pattern API,用于对输入流数据进行复杂事件规则定义,用于提取符合规则的事件序列。

个体模式

组成复杂规则的每一个单独的模式定义,就是个体模式。

个体模式分为单例模式和循环模式,单例模式一次只能接收一个事件,而循环模式可以接收多个。

个体模式有多个重要组成部分:

  • 量词

    可以在个体模式后追加量词,也就是循环次数。

    // 匹配出现4次
    start.times(4)
    // 匹配出现0次或4次
    start.times(4).optional
    // 匹配出现2,3或者4次
    start.times(2,4)
    // 匹配出现2,3或者4次,并且尽可能多地重复匹配
    start.times(2,4).greedy
    // 匹配出现1次或多次
    start.oneOrMore
    // 匹配出现0次、2次或多次,并且尽可能多的重复匹配
    start.timesOrMore(2).optional.greedy 
    
  • 条件

    每个模式都需要指定触发条件

    // 简单条件 通过where()方法对事件中的字段进行判断筛选,决定是否接受该事件
    start.where(new SimpleCondition<Event>(){
        @Override
        public boolean filter(Event value) throws Exception{
            return value.getName.startsWith("foo");
        }
    }
                
    // 组合条件 将简单条件见合并,or()方法表示逻辑或连接,where()方法表示逻辑与连接。
    pattern.where().or()
    
    // 终止条件 如果使用了oneOrMore或者oneOrMore.optional,建议使用.until()作为终止条件,便于清理状态
    
    // 迭代条件 能够对模式之前所有接收的事件继续处理 
    .where(new IterativeCondition<Event>())
    

组合模式

很多个体模式组合起来,就形成了整个的模式序列。模式序列必须以一个初始模式开始。

模式序列也分为严格近邻和宽松近邻。

  • 严格近邻

    所有事件按照严格的顺序出现,中间没有任何不匹配的事件,由.next()指定。
    在这里插入图片描述

  • 宽松近邻

    允许中间出现不匹配的事件,由.followedBy()指定
    在这里插入图片描述

  • 非确定性宽松近邻

    进一步放宽条件,之前已经匹配过的事件可以再次使用,由followedByAny()指定。

  • 不希望出现某种近邻

    .notNext()不想让某个事件严格紧邻前一个事件发生

    .notFollowedBy()不想让某个事件在两个事件之间发生

  • 注意事项

    • 所有模式序列必须以.begin()开始

    • 模式序列不能以.notFollowedBy()结束

    • “not”类型的模式不能被optional所修饰

    • 此外,还可以为模式指定时间约束,用来要求在多长时间内匹配有效 next.within(Time.seconds(10))

模式检测

指定要查找的模式序列后,就可以将其应用于输入流以检测潜在匹配。

调用CEP.pattern(),给定输入流和模式,就可以得到一个patternStream。

DataStream<Event> input = ...
Pattern<Event,Event> pattern = Pattern.<Event>begin("start").where(...)...
PatternStream<Event> patternStream = CEP.pattern(input,pattern);
匹配事件的提取

创建 PatternStream 之后,就可以应用 select 或者 flatselect 方法,从检测到的事件序列中提取事件。

select() 方法需要输入一个 select function 作为参数,每个成功匹配的事件序列都会调用它。

select() 以一个 Map<String,List > 来接收匹配到的事件序列,其中 key 就是每个模式的名称,而 value 就是所有接收到的事件的 List 类型。

public OUT select(Map<String,List<IN>>pattern)throws Exception{
    IN startEvent = pattern.get("start").get(0); 
    IN endEvent = pattern.get("end").get(0); 
    return new OUT(startEvent, endEvent);
}
超时时间的提取

当一个模式通过 within 关键字定义了检测窗口时间时,部分事件序列可能因为超过窗口长度而被丢弃;为了能够处理这些超时的部分匹配,select 和 flatSelect API 调用允许指定超时处理程序。

超时处理程序会接收到目前为止由模式匹配到的所有事件,由一个 OutputTag 定义接收到的超时事件序列。

PatternStream<Event>patternStream = CEP.pattern(input,pattern); 
OutputTag<String>outputTag = new OutputTag<String>("side-output"){};
SingleOutputStreamOperator<ComplexEvent> flatResult = 
patternStream. flatSelect( 
	outputTag,
	new PatternFlatTimeoutFunction<Event,TimeoutEvent>(){...}, 
	new PatternFlatSelectFunction<Event,ComplexEvent>(){...}
);
DataStream<TimeoutEvent> timeoutFlatResult = flatResult.getSideOutput(outputTag);

模式组

将一个模式序列作为条件嵌套在个体模式里,成为一组模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒 暄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值