Flink CEP PojoSerializer错误的多态性解析

时间:2019-01-19 13:55:08

标签: scala apache-flink flink-cep

目前,当我打印CEP模式的结果时,我的行为很奇怪。

数据模型如下:

  • 事件 :(类型:字符串,时间戳:长)
  • VehicleRelated 扩展了事件:(vehicleId:Integer)
  • 位置扩展了VehicleRelated :(位置:整数,方向:整数)
  • 识别扩展了VehicleRelated:(pos:整数,id:整数,方向:整数)

CEP部分如下所示:

val pattern = Pattern
  .begin[VehicleRelated]("before")
  .subtype(classOf[Position])
  .next("recognize")
  .subtype(classOf[Recognize])
  .next("after")
  .subtype(classOf[Position])
  .within(Time.seconds(5))

val patternStream = CEP.pattern(actionEvents, pattern)
val recognitions = patternStream
  .select(pattern => {
    val s = pattern("recognize").head.asInstanceOf[Recognize]
    LOG.debug(s.toString)
    s
  })

recognitions.print("RECO")

日志的输出如下:

14:45:27,286 DEBUG stoff.schnaps.RecognizingJob$ - Recognize(VehicleId: 2, Id: 601, Pos: 1601, Direction: 35, Add: Map())
RECO:8> Recognize(VehicleId: null, Id: 601, Pos: 1601, Direction: 35, Add: Map())

现在最大的问题是,为什么我返回转换的对象后 vehicleId 属性为null?有什么建议吗?

更新我进行了一些调查,发现PojoSerializer是问题所在。复制函数被调用,并且在第151行this.numFields上是错误的。.计数仅包括Recognize类本身的属性的计数,而没有继承的类,在这种情况下为Event和VehicleRelated。.属性类型和时间戳也为null。.

1 个答案:

答案 0 :(得分:0)

问题是flink内部POJO序列化程序无法正确解析多态。

因此,我将Kyro序列化器设置为默认值:

val config = env.getConfig
config.enableForceKryo()