当我使用 Flink CEP 代码处理时间(默认情况下是配置)时,我能够获得所需的模式匹配,但是在将 env 配置为事件时间时,我无法获得任何模式匹配。

 def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
    env.enableCheckpointing(3000) // checkpoint every 3000 msec
     val lines = env.addSource(consumerKafkaSource.consume("bank_transaction_2", "192.168.2.201:9092", "192.168.2.201:2181", "http://192.168.2.201:8081"))

  val eventdate = ExtractAndAssignEventTime.assign(lines, "unix", "datetime", 3) //Extracting date time here

    val event = eventdate.keyBy(v => v.get("customer_id").toString.toInt)
   val pattern1 = Pattern.begin[GenericRecord]("start").where(v=>v.get("state").toString=="FAILED").next("d").where(v=>v.get("state").toString=="FAILED")
      val patternStream = CEP.pattern(event, pattern1)
    val warnID = patternStream.sideOutputLateData(latedata).select(value =>  {
      val v = value.mapValues(c => c.toList.toString)
      Json(DefaultFormats).write(v).replace("\\\"", "\"")
        //.replace("List(","{").replace(")","}")
    })
    val latedatastream = warnID.getSideOutput(latedata)
    latedatastream.print("late_data")


    warnID.print("warning")
    event.print("event")

时间戳提取代码

object ExtractAndAssignEventTime {
  def assign(stream:DataStream[GenericRecord],timeFormat:String,timeColumn:String,OutofOrderTime:Int ):DataStream[GenericRecord] ={
    if(!(timeFormat.equalsIgnoreCase("Unix"))){
      val EventTimeStream=stream.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor[GenericRecord](Time.seconds(3)) {
        override def extractTimestamp(t: GenericRecord): Long = {
          new java.text.SimpleDateFormat(timeFormat).parse(t.get(timeColumn).toString).getTime
        }
      })
      EventTimeStream
    }
    else{
      val EventTimeStream=stream.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor[GenericRecord](Time.seconds(OutofOrderTime)) {
        override def extractTimestamp(t: GenericRecord): Long = {
          (t.get(timeColumn).toString.toLong)
        }
      })
      EventTimeStream
    }
  }

请帮我解决这个问题。 提前致谢。!

#1楼 票数:0 已采纳

由于您使用的是AssingerWithPeriodicWatermark您还需要设置setAutowatermarkInterval以便 Flink 将使用此间隔来生成水印。

您可以通过调用env.getConfig.setAutoWatermarkInterval([interval])来做到这一点。

对于事件时间 CEP 基于水印,所以如果不生成它们,那么基本上不会有输出。

#2楼 票数:0

我遇到了同样的问题,我刚刚“解决”了它,但是正如您将看到的,答案没有多大意义(至少对我而言)。

解释:

在我的原始代码中,我有这个:

var env = StreamExecutionEnvironment.getExecutionEnvironment
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
env.setParallelism(1)
env.getConfig.setAutoWatermarkInterval(1)

...

var stream : DataStream[String] = env.readTextFile("/home/luca/Desktop/input")
    
    
var tupleStream = stream.map(new S2TMapFunction())
tupleStream.assignTimestampsAndWatermarks(new PlacasPunctualTimestampAssigner())

val pattern = Pattern.begin[(String,Double,Double,String,Int,Int)]("follow").where(new SameRegionFunction())

val patternStream = CEP.pattern(newTupleStream,pattern)

val result = patternStream.process(new MyPatternProcessFunction())

根据我的日志记录,我看到SameRegionFunctionMyPatternProcessFunction都没有被执行,至少可以说这是非常出乎意料的。

回答:

由于我一无所知,我决定测试让我的流通过另一个转换函数,只是为了检查我的事件是否真的被插入到流中。 因此,我将tupleStream提交给 map 操作,生成newTupleStream ,如下所示:

var env = StreamExecutionEnvironment.getExecutionEnvironment
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
env.setParallelism(1)
env.getConfig.setAutoWatermarkInterval(1)

...

var stream : DataStream[String] = env.readTextFile("/home/luca/Desktop/input")


/* I created 'DoNothingMapFunction', where the output event = input event*/
var tupleStream = stream.map(new S2TMapFunction())
var newTupleStream = tupleStream.assignTimestampsAndWatermarks(new PlacasPunctualTimestampAssigner()).map(new DoNothingMapFunction())


val pattern = Pattern.begin[(String,Double,Double,String,Int,Int)]("follow").where(new SameRegionFunction())

val patternStream = CEP.pattern(newTupleStream,pattern)

val result = patternStream.process(new MyPatternProcessFunction())

然后SameRegionFunctionMyPatternProcessFunction决定运行。

观察:

我改变了线路:

var newTupleStream = tupleStream.assignTimestampsAndWatermarks(new PlacasPunctualTimestampAssigner()).map(new DoNothingMapFunction())

对此:

var newTupleStream = tupleStream.assignTimestampsAndWatermarks(new PlacasPunctualTimestampAssigner())

它也有效。 显然,只是另一个间接级别就足以使其工作,尽管我不清楚为什么会发生这种情况。

  ask by Anish Sarangi translate from so

未解决问题?本站智能推荐:

1回复

flink运行超过12小时导致机器CPU负载增加的原因

我有一个 flink 作业,并行度设置为 6,很少进行简单的转换,问题是当 Flink 运行超过 12 小时时,例如机器上的负载开始增加,然后我认为这是因为流量在一天中的几个小时内进入 flink,但问题是当流量下降时,机器上的负载会继续高一点,比以前低但仍然更高。 用例: 我的问题:例如,当
1回复

如何将新事件添加到Flink CEP数据流?

我正在使用flink 1.5.2解决CEP问题。 我的数据来自列表,系统运行时,其他一些过程会将新的Event对象添加到该列表中。 它不是套接字或网络消息。 我一直在阅读官方网站示例。 这是我想应该做的步骤。 使用env.fromCollection(list)创建一个Da
1回复

FlinkCEP的执行时间

我正在使用Flink和FlinkCEP来检测数据流上的复杂事件。 出于研究目的,我只需要测量识别时间。 我正在使用Flink / FlinkCEP - 1.7.1 。 我正在使用env.fromCollection()函数在Flink环境中创建流。 之后,我将使用FlinkCEP:
1回复

Flink-时代的行为或更多

我想找到随后发生的事件的模式 内部模式是: 关键字“ sensorArea”具有相同的值。 关键字“ customerId”具有不同的值。 彼此相距不到5秒。 这个模式需要 仅在先前发生3次或更多次时才发出“警报”。 我写了一些东西,但我
2回复

Flink 1.10.1 的行为与最大并行度大于 1

首先,我已经在这里发现了这个问题: flink program 在 parallelism 中的行为不同,它看起来与我现在面临的问题相同,但我认为在我的场景中我确实需要 CEP,因为我有超过 1.000。每小时分析属于不同用户密钥的 000 条记录。 因此,当我使用并行度 1 运行 cep 时,一
1回复

在Flink或任何其他系统中合并两种不同类型的数据流

我想将Flink用于远程病人监护案例,其中包括陀螺仪,加速度计,ECG流,HR速率流,RR速率等各种传感器。因此在这种情况下,不可能有相同的数据类型或输入率等,但我仍想检测心律不齐或其他涉及这些多个传感器的CEP的医疗状况 我所知道的是,如果我想对这些传感器执行一些复杂的事件处理,那么在C
1回复

多种事件类型的Apache Flink CEP模式

目前,我正在一个学期项目中,必须识别这三个事件系列。 像P -> R -> P 我们有两种不同的事件类型,它们是通过同一主题中的Kafka连接器使用的。 我创建了一个称为Event的父类,其他两个类型均从该父类派生。 Kafka连接器将带EventSchema的J
1回复

warnings.print()以相反的顺序打印事件(最后一个事件优先),Apache Flink CEP中的第一个事件除外

我正在尝试使用以下模式过滤Flink中所有> 10的临时事件, 输入是一个文本文件,由输入函数将其解析为流,输入文件的内容为:- 这里的第一个值为Rack_id,第二个为Temperature 我在输入流和WarnigsStream上都发出了print(),如下所示