flink CEP 介绍和实例
Flink介绍
Flink 是一个分布式的基于状态计算的流处理计算引擎,可以处理有边界流数据和无边界流数据,在内存中执行计算,而且具有任意扩展计算能力。 最初由柏林工业大学的一个研究项目,后被阿里巴巴收购。它和spark 功能类似,但是某些特征优于spark。
Flink 提供了对于复杂事件模式识别的功能,并以提供一个专用库(flink-cep),方便用户开发CEP 应用。
CEP 定义和适用场景
CEP 英文全称是“complex event processing” , 即“复杂事件处理” ,它可以探查无限流数据中的复杂模式,使得抓取其中的重要事件。
通过这种能力,我们可以对大型应用,海量用户行为,海量数据进行实时监控,并提取所需信息,尤其是重要的,危急,欺诈的信息。
适用的场景包括,银行应用的信用欺诈,大型系统的系统失效恢复,用户行为监控(直播平台用户弹幕合规),舆情监控,等等。
说说模式:
先介绍下事件和事件流:
单一事件:一个事件,比如某个节点的一条日志。
事件序列:多个事件按时间顺序形成的一个序列。
单个模式:
可以为模式定义“条件”,条件可以是‘简单条件’ 和迭代条件。依据该条件,确定是否匹配event。其中迭代条件的含义是这就是您可以根据先前接受的event的属性或其中一个子集的统计信息来指定接受后续事件的条件的方法。多个条件甚至可以使用 AND , OR 等进行组合,类似于SQL语句的where条件语句。
1,单例模式
只能发生一次,接收一个事件
2,循环模式
可以定义模式发生匹配的数量。
模式序列:
定义:多个模式按时间顺序排列,组成一个序列.
既然是多个模式组成序列,前一个模式发生匹配后,是否接下来的event 必须匹配第二个模式, 因此定义了“邻近条件”。
next()
, for strict, 严格模式,必须followedBy()
, for relaxed, andfollowedByAny()
, for non-deterministic relaxed contiguity.
3,Flink cep 开发流程:
3.1,定义flink 开发环境
3.2,定义输入流
3.3,定义匹配模式
3.4,使用模式去匹配事件流
3.5,提取结果数据并输出
4,CEP 代码实例:
4.1,功能:
本实例使用socket 流模拟应用日志流,作为数据输入流。定义的匹配模式为:在1分钟内,如果某个实体依次发送 warn 和 danger级别日志,则捕捉到该数据,并输出到控制板。
4.2 ,代码:
public class FraudDetectionJob {
public static void main(String[] args) throws Exception {
System.out.println("Hello World!");
StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironment();
// 输入流定义,从socket 读入模拟的流数据
DataStream<Event> input = env
.socketTextStream("localhost", 9000)
.map(str -> new Event(str.split(",")[0], str.split(",")[1], str.split(",")[2]))
/*.keyBy(event -> event.getId())*/;
// 定义需要捕捉的事件规则
Pattern<Event, ?> pattern = Pattern.<Event>begin("start")
.where(SimpleCondition.of(event -> event.getLevel().equals("warn")))
.next("end")
.where(SimpleCondition.of(event -> event.getLevel().equals("danger")))
.within(Time.minutes(1));
//对输入流适配规则
PatternStream<Event> patternStream = CEP.pattern(input.keyBy(e -> e.getId()), pattern);
//输出结果流事件
DataStream<Alert> result = patternStream.process(
new PatternProcessFunction<Event, Alert>() {
@Override
public void processMatch(
Map<String, List<Event>> match,
Context ctx,
Collector<Alert> out) throws Exception {
Event warn = match.get("middle").get(0);
Event danger = match.get("danger").get(0);
Alert alter = new Alert(warn, danger);
out.collect(alter);
}
});
result.print();
}
}
代码难点:
1,复杂规则底层原理为非确定有限状态机。模式理解和定义过程比较复杂。
参考: