Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Flink CEP不在事件时间工作,但在处理时间工作_Java_Scala_Apache Flink_Complex Event Processing_Flink Cep - Fatal编程技术网

Java Flink CEP不在事件时间工作,但在处理时间工作

Java Flink CEP不在事件时间工作,但在处理时间工作,java,scala,apache-flink,complex-event-processing,flink-cep,Java,Scala,Apache Flink,Complex Event Processing,Flink Cep,当我使用Flink CEP代码处理时间(默认配置)时,我能够获得所需的模式匹配,但在配置env to Event time时,我无法获得任何模式匹配 def main(args: Array[String]): Unit = { val env = StreamExecutionEnvironment.getExecutionEnvironment env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)

当我使用Flink CEP代码处理时间(默认配置)时,我能够获得所需的模式匹配,但在配置env to Event time时,我无法获得任何模式匹配

 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
    }
  }


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

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

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


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

我有同样的问题,我刚刚“解决”了它,但答案没有多大意义(至少对我来说),正如你所看到的

说明: 在我的原始代码中,我有:

var env=StreamExecutionEnvironment.getExecutionEnvironment
环境setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
环境设置(1)
env.getConfig.setAutoWatermarkInterval(1)
...
变量流:DataStream[String]=env.readTextFile(“/home/luca/Desktop/input”)
var tupleStream=stream.map(新的S2TMapFunction())
tupleStream.assignTimestampsAndWatermarks(新的PlacasPunctualTimestampAssigner())
val pattern=pattern.begin[(String,Double,Double,String,Int,Int)](“follow”)。其中(new SameRegionFunction())
val patternStream=CEP.pattern(newTupleStream,pattern)
val result=patternStream.process(新的MyPatternProcessFunction())
根据我的日志记录,我看到没有执行
SameRegionFunction
MyPatternProcessFunction
,至少可以说这是非常意外的

答复: 因为我不知道,所以我决定测试让我的流再经过一个转换函数,只是为了检查我的事件是否真的被插入流中。因此,我将
tupleStream
提交给映射操作,生成
newTupleStream
,如下所示:

var env=StreamExecutionEnvironment.getExecutionEnvironment
环境setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
环境设置(1)
env.getConfig.setAutoWatermarkInterval(1)
...
变量流:DataStream[String]=env.readTextFile(“/home/luca/Desktop/input”)
/*我创建了“DoNothingMapFunction”,其中输出事件=输入事件*/
var tupleStream=stream.map(新的S2TMapFunction())
var newTupleStream=tupleStream.assignTimestampsAndWatermarks(新的PlacasPunctualTimestampAssigner()).map(新的DoNothingMapFunction())
val pattern=pattern.begin[(String,Double,Double,String,Int,Int)](“follow”)。其中(new SameRegionFunction())
val patternStream=CEP.pattern(newTupleStream,pattern)
val result=patternStream.process(新的MyPatternProcessFunction())
然后
SameRegionFunction
MyPatternProcessFunction
决定运行

Obs: 我换了一行:

var newTupleStream=tupleStream.assignTimestampsAndWatermarks(新的PlacasPunctualTimestampAssigner()).map(新的DoNothingMapFunction())
为此:

var newTupleStream=tupleStream.assignTimestampsAndWatermarks(新的PlacasPunctualTimestampAssigner())

而且它也起了作用。显然,仅仅是另一个间接层次就足以让它工作,尽管我不清楚它为什么会发生。

多明尼克,谢谢你的回答,但是如果水印是在env.config中设置的特定时间间隔生成的,那么BoundedAutoforderness将如何工作??在每个时间间隔,生成的水印将等于当前的
currentMaxTimestamp-outOfOrderness
:),因此,outOfOrderness实际上是根据具有最高时间戳的元素,元素可以延迟多长时间。