flink CEP 介绍和实例
1,Flink介绍
Flink 是一个分布式的基于状态计算的流处理计算引擎,或者说框架,可以处理有边界流数据和无边界流数据,在内存中执行计算,而且具有任意扩展计算能力。 最初由柏林工业大学的xxx 小组研发,后被阿里巴巴收购。初略看起来,和spark 功能类似,但是某些特征优于spark。
Flink 提供了对于复杂事件模式识别的功能,并以提供一个专用库(flink-cep),方便用户开发CEP 应用。
2, CEP 定义 和场景
CEP 英文全称是“complex event processing” , 即“复杂事件处理” ,它可以探查无限流数据中的复杂模式,使得抓取其中的重要事件。
通过这种能力,我们可以对大型应用,海量用户行为,海量数据进行实时监控,并提取所需信息,尤其是重要的,危急,欺诈的信息。
适用的场景包括,银行应用的信用欺诈,大型系统的系统失效恢复,用户行为监控(直播平台用户弹幕合规),舆情监控,等等。
3,Flink cep 开发流程:
1,定义flink 环境
2,输入流
3,定义 复杂模式
4,应用模式,
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,复杂规则底层原理为非确定有限状态机。模式理解和定义过程比较复杂。
参考:
1, Flink CEP 官方文档: CEP 开发