Flink系列03: FlinkCEP从源码开始学习-PatternStream与执行模式匹配 - 附代码案例

本文深入探讨Apache Flink的复杂事件处理(CEP)模块,详细解析如何执行模式匹配,包括事件源、模式定义、时间语义设定以及PatternStream的关键方法。通过实例代码展示了如何配置和使用CEP进行模式检测,并讨论了匹配过程中的时间管理和性能优化。同时,文章指出在EventTime模式下需手动设置水印以避免无结果的情况,并提供了处理超时匹配的解决方案。

前情提要:前两期研究如何定义个体模式和模式组的各种配置、链接,这期的目的是研究如何执行匹配的。

转载注明原作者:xiaozoom

转载博客地址:xiaozoom的csdn博客

xiaozoom的博客_优快云博客-flinkCDC,数据同步,Flink领域博主

如何执行模式匹配

 官网的解释是这样的:

DataStream<Event> input = ...
Pattern<Event, ?> pattern = ...
EventComparator<Event> comparator = ... // optional

PatternStream<Event> patternStream = CEP.pattern(input, pattern, comparator);

需要:

  • 一个事件源 input
  • 定义好的模式(不论个体还是模式组)
  • 用于在事件的TimeStamp相同时进行排序的EventComparator
  • 定义方法:CEP.pattern

由于要执行存在验证是否连续的关系,很自然的会将parallelism强制设为1。input源不区分keyed和non-keyed。但是如果对non-keyed适用,可能会变成性能瓶颈。

因此,尽可能的在应用CEP之前,先用Key进行分流。

因此本期涉及到的类主要要:

  • org.apache.flink.cep.CEP
  • org.apache.flink.cep.PatternStream<T>
public class CEP {
    /**
     * Creates a {@link PatternStream} from an input data stream and a pattern.
     *
     * @param input DataStream containing the input events
     * @param pattern Pattern specification which shall be detected
     * @param <T> Type of the input events
     * @return Resulting pattern stream
     */
    public static <T> PatternStream<T> pattern(DataStream<T> input, Pattern<T, ?> pattern) {
        return new PatternStream<>(input, pattern);
    }

    /**
     * Creates a {@link PatternStream} from an input data stream and a pattern.
     *
     * @param input DataStream containing the input events
     * @param pattern Pattern specification which shall be detected
     * @param comparator Comparator to sort events with equal timestamps
     * @param <T> Type of the input events
     * @return Resulting pattern stream
     */
    public static <T> PatternStream<T> pattern(
            DataStream<T> input, Pattern<T, ?> pattern, EventComparator<T> comparator) {
        final PatternStream<T> stream = new PatternStream<>(input, pattern);
        return stream.withComparator(comparator);
    }
}

从简短的源代码,不难看出CEP只是定义好的入口类,真正需要研究还得看PatternStream类。

PatternStream类,没有继承任何超类,可以看出在代码层级中是属于比较底层的了。

基本的定义区:

    private final PatternStreamBuilder<T> builder;

    private PatternStream(final PatternStreamBuilder<T> builder) {
        this.builder = checkNotNull(builder);
    }

    PatternStream(final DataStream<T> inputStream, final Pattern<T, ?> pattern) {
        this(PatternStreamBuilder.forStreamAndPattern(inputStream, pattern));
    }

    PatternStream<T> withComparator(final EventComparator<T> comparator) {
        return new PatternStream<>(builder.withComparator(comparator));
    }

    public PatternStream<T> sideOutputLateData(OutputTag<T> lateDataOutputTag) {
        return new PatternStream<>(builder.withLateDataOutputTag(lateDataOutputTag));
    }

时间语义设定:

    /** Sets the time characteristic to processing time. */
    public PatternStream<T> inProcessingTime() {
        return new PatternStream&l
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值