并行处理Flink CEP中的多个模式

时间:2017-08-30 23:57:49

标签: apache-flink flink-streaming flink-cep

我有以下案例场景

enter image description here

有两台虚拟机正在向Kafka发送流,这些虚拟机正在被CEP引擎接收,当单个流满足特定条件时会生成警告。

目前,CEP正在检查两个患者的两个流的相同条件(当心率> 65和呼吸率> 68时),并且如下所示并行发出警报

 // detecting pattern
        Pattern<joinEvent, ? > pattern = Pattern.<joinEvent>begin("start")
                .subtype(joinEvent.class).where(new FilterFunction<joinEvent>() {
                    @Override
                    public boolean filter(joinEvent joinEvent) throws Exception {
                        return joinEvent.getHeartRate() > 65 ;
                    }
                })
                .subtype(joinEvent.class)
                .where(new FilterFunction<joinEvent>() {
                    @Override
                    public boolean filter(joinEvent joinEvent) throws Exception {
                        return joinEvent.getRespirationRate() > 68;
                    }
                }).within(Time.milliseconds(100));

但我想为两个Streams使用不同的条件。例如,如果

,我想提出警报
For patient A : if heart rate > 65 and Respiration Rate > 68
For patient B : if heart rate > 75 and Respiration Rate > 78

我如何实现这一目标?我是否需要在同一环境中创建多个流环境或多个模式。

1 个答案:

答案 0 :(得分:2)

根据您的要求,您可以创建2种不同的模式,以便在需要时进行明确分离。

如果你想用相同的模式执行它,那么它也是可能的。为此,请在一个kafka源中阅读所有kafka主题:

    FlinkKafkaConsumer010<JoinEvent> kafkaSource = new FlinkKafkaConsumer010<>(
        Arrays.asList("topic1", "topic2"),
        new StringSerializerToEvent(),
        props);

这里我假设两个主题的事件结构是相同的,你有患者姓名以及被传送的事件的一部分。

一旦你这样做,它变得很容易,因为你只需要创建一个带有“Or”的模式,如下所示:

    Pattern.<JoinEvent>begin("first")
        .where(new SimpleCondition<JoinEvent>() {

          @Override
          public boolean filter(JoinEvent event) throws Exception {
            return event.getPatientName().equals("A") && event.getHeartRate() > 65 && joinEvent.getRespirationRate() > 68;
          }
        })
        .or(new SimpleCondition<JoinEvent>() {

          @Override
          public boolean filter(JoinEvent event) throws Exception {
            return event.getPatientName().equals("B") && event.getHeartRate() > 75 && joinEvent.getRespirationRate() > 78;
          }
        });

只要条件匹配,就会产生匹配。虽然,我不太确定你的例子中有什么“.within(Time.milliseconds(100))”。