Flink入门(6)--Flink CEP

Flink CEP的 概述与分类

  1. Flink CEP的 概述
    CEP 即Complex Event Processing即复杂事件处理,Flink CEP是在Flink种实现复杂事件处理的库。处理事件的规则被叫做Pattern,Flink CEP提供了Pattern API,用于对输入数据进行复杂事件的规则定义,用来提取符合规则的事件序列。
  2. 三种Pattern API: 个体模式,组合模式,模式组
  3. 应用:实时监控恶意登录,虚假交易。金融行业识别风险、营销广告等

Pattern API

Pattern分类

  1. 个体模式:个体模式包括单例模式和循环模式,单例模式只接收一个事件,而循环模式可以接受多个事件。
    (1)量词
    (2 ) 条件 .where,.or().until() utils可作为终止条件,以便清理状态
start.times(3).where(_.behavior.startsWirh('fav'))
start.oneOrTwo//出现1次或2次
start.timesOrMore(2).optional.greedy//匹配出现0、2或多次
  1. 组合模式
val start = Pattern.begin('start')
  1. 模式组: 将一个模式序列作为条件潜逃在一个个体里面,成为一组模式

模式序列

  1. 严格临近,所有时间按照严格的顺序出现,中间没有任何不匹配的事件,由.next()指定
  2. 宽松临近,允许中间出现不匹配的事件。由.followedby指定
  3. 非确定性宽松临近,表示之前已经匹配过的事件也可以再次使用,由.followedByAny 指定
  4. 不希望出现某种临近关系,比如.notNext()
  5. 所有模式必须以.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
  • 17
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值