打印不出数据的原因
- 默认的事件触发时间是事件时间
- 官网没有说明如何设置处理时间
如何打印出数据
- 按照官网提示的,无key的流设置并行度为1
- 设置事件触发的时间为处理事件,代码如下:
PatternStream<String> patternStream = CEP
.pattern(input, pattern)
.inProcessingTime();
完整测试代码
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.SimpleCondition;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.RichSourceFunction;
import org.apache.flink.util.Collector;
import java.util.List;
import java.util.Map;
/**
*
*
* 复杂事件处理定义: 在信息流中识别用户定义的有意义的事件。
*
* Flink中的事件: 每一条数据是一个事件
*
* 复杂事件: 基于时间流的多个关联事件组合在一起,产生的新事件。
*
* 复杂事件处理过程: 多个事件发生的时间/之间的关联/内在的属性状态 -> 处理 推断 动作
*
* 规则: 定义复杂事件如何产生。
*
*
*/
public class StreamingJob {
public static void main(String[] args) throws Exception {
// set up the streaming execution environment
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource<String> input = env.addSource(new RichSourceFunction<String>() {
boolean isClose = false;
@Override
public void run(SourceContext<String> sourceContext) throws Exception {
while (!isClose) {
// System.out.println("send data ");
sourceContext.collect("abcd");
sourceContext.collect("dec");
sourceContext.collect("ded");
sourceContext.collect("abc");
Thread.sleep(1000);
}
}
@Override
public void cancel() {
System.out.println("close source");
isClose = true;
}
}).setParallelism(1);
// 当第一个事件是以a开头的时候,第二个事件必须以c为结尾,复杂事件的结束以第n个事件等于abc而触发处理
Pattern<String, ?> pattern = Pattern.<String>begin("start").where(
new SimpleCondition<String>() {
@Override
public boolean filter(String event) {
return event.startsWith("a");
}
}
).next("middle").where(
new SimpleCondition<String>() {
@Override
public boolean filter(String subEvent) {
return subEvent.endsWith("c");
}
}
).followedBy("end").where(
new SimpleCondition<String>() {
@Override
public boolean filter(String event) {
return event.equals("abc");
}
}
);
PatternStream<String> patternStream = CEP.pattern(input, pattern)
.inProcessingTime();
DataStream<String> result = patternStream.process(
new PatternProcessFunction<String, String>() {
@Override
public void processMatch(
Map<String, List<String>> pattern,
Context ctx,
Collector<String> out) throws Exception {
List<String> start = pattern.get("start");
List<String> middle = pattern.get("middle");
List<String> end = pattern.get("end");
System.out.println("start:" + start);
System.out.println("middle:" + middle);
System.out.println("end:" + end);
out.collect("ccccc");
}
}).setParallelism(1);
result.print();
// execute program
env.execute("Flink Streaming CEP Test ");
}
}
关注以下微信公众号,了解更多关于复杂事件处理的知识。

该博客主要探讨了在 Apache Flink 中使用复杂事件处理(CEP)进行事件时间与处理时间设置的问题。示例代码展示了如何设置无键流的并行度,并通过 PatternStream 使用 inProcessingTime() 方法指定事件触发时间。然而,博主遇到了无法打印数据的困扰,代码中定义了一个模式匹配规则,并尝试打印匹配到的事件,但未得到预期结果。文章适合对 Flink 和 CEP 有一定了解的读者,旨在解决实际遇到的事件处理难题。
&spm=1001.2101.3001.5002&articleId=123935337&d=1&t=3&u=9e860c2bae2f491197dd3cba33564672)
1436

被折叠的 条评论
为什么被折叠?



