1.CEP定义
- 复杂事件处理(Complex Event Processing,CEP)
- Flink CEP是在 Flink 中实现的复杂事件处理(CEP)库
- CEP 允许在无休止的事件流中检测事件模式,让我们有机会掌握数据中重要的部分
- 一个或多个由简单事件构成的事件流通过一定的规则匹配,然后输出用户想得到的数据 —— 满足规则的复杂事件
2.CEP特点
- 目标:从有序的简单事件流中发现一些高阶特征
- 输入:一个或多个由简单事件构成的事件流
- 处理:识别简单事件之间的内在联系,多个符合一定规则的简单事件构成复杂事件
- 输出:满足规则的复杂事件
3.Pattern API
- 处理事件的规则,被叫做“模式”(Pattern)
- Flink CEP 提供了 Pattern API,用于对输入流数据进行复杂事件规则定义,用来提取符合规则的事件序列
案例演示:检测连续三次登录失败:
import org.apache.flink.cep.scala.CEP
import org.apache.flink.cep.scala.pattern.Pattern
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time
import scala.collection.Map
object CepExample {
case class LoginEvent(userId:String,ip:String,eventType:String,eventTime: Long)
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1)
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
val stream = env
.fromElements(
LoginEvent("user_1", "0.0.0.0", "fail", 1000L),
LoginEvent("user_1", "0.0.0.1", "fail", 2000L),
LoginEvent("user_1", "0.0.0.2", "fail", 3000L),
LoginEvent("user_2", "0.0.0.0", "success", 4000L)
)
.assignAscendingTimestamps(_.eventTime)
.keyBy(_.userId)
val pattern =Pattern
.begin[LoginEvent]("first").where(_.eventType.equals("fail"))
.next("second").where(_.eventType.equals("fail"))
.next(("third")).where(_.eventType.equals("fail")