Apache flink Flink窗口在连接到广播流后不会启动

Apache flink Flink窗口在连接到广播流后不会启动,apache-flink,Apache Flink,我尝试使用BroadcastStatePattern来扩展应用程序的功能。 这里有一些代码主代码 // .... /// val gatewayBroadcastStateDescriptor = new MapStateDescriptor[String, BCA]("gatewayEvents", classOf[String], classOf[BCASTDATACLASS]) // Broadcast source val broadcastSource = en

我尝试使用BroadcastStatePattern来扩展应用程序的功能。 这里有一些代码<代码>主代码

// .... ///
val gatewayBroadcastStateDescriptor = new MapStateDescriptor[String, BCA]("gatewayEvents", classOf[String], classOf[BCASTDATACLASS])


// Broadcast source
val broadcastSource = env
  .addSource(new FlinkKinesisConsumer[String](s"BROADCAST", new SimpleStringSchema, consumerConfig))

val broadcastSourceGatewayEvents = broadcastSource
  .filter(_.contains("someText"))
  .map(json => read[BCASTDATACLASS](json))

val broadcastGatewayEventsConfigurations = broadcastSourceGatewayEvents.broadcast(gatewayBroadcastStateDescriptor)

// packet source
val packetSource = env
  .addSource(
    new FlinkKinesisConsumer[String](s"PACKETS", new SimpleStringSchema, consumerConfig))

val packets = packetSource.disableChaining()
  .map(json => read[MAINDATACLASS](json))
  .assignTimestampsAndWatermarks(WatermarkStrategy
    .forBoundedOutOfOrderness[MAINDATACLASS](Duration.ofSeconds(2))
    .withTimestampAssigner(new PacketWatermarkGenerator))
  .timeWindowAll(Time.seconds(2))
  .process(new OrderPacketWindowFunction)
  .disableChaining()

// connect MainDataSource with BroadcastDataSource
val gwEnrichedPackets = packets
  .keyBy(_.gatewayId)
  .connect(broadcastGatewayEventsConfigurations)
  .process(new EnrichingPackets)
My
window
函数(在本例中不做任何操作,只需进一步转发数据)

连接数据和配置流之后,我将打开窗口并进行一些处理。 但当我从
gwEnrichedPackets
打开窗口时,什么也没发生,我只能看到(flinkui)窗口中传入的消息。即使使用
会话窗口
并停止数据流,窗口也不会启动

允许延迟
侧输出延迟数据
无助于问题的调查

有趣的一点是,如果我从
数据包
打开窗口,一切正常

//  val sessionWindows = gwEnrichedPackets - NOT works
//  val sessionWindows = packets - Works

val sessionWindows = gwEnrichedPackets
  .keyBy(_.tag.tagId)
  .timeWindow(Time.seconds(20))
  //.window(EventTimeSessionWindows.withGap(Time.seconds(120)))
  //.allowedLateness(Time.seconds(12000))
  //.sideOutputLateData(new OutputTag[MAINDATACLASS]("late-readings"))
  .process(new DetectTagGatewayDisconnections)

val lateStream = sessionWindows
  .getSideOutput(new OutputTag[MAINDATACLASS]("late-readings"))

lateStream.print()
sessionWindows.print()

我做错了什么?

问题是水印在这种情况下,您只为其中一个流分配水印,当给定运算符的输入上有多个流时,Flink总是选择最低的水印

因此,在您的情况下,Flink必须在
数据包生成的水印和广播流生成的水印之间进行选择,其中一个水印总是
Long.MinVal
(因为控制流没有水印生成器),所以它总是选择
Long.MinVal
,因此windows永远不会运行


在这种情况下,您只需将水印赋值器添加到
gwEnrichedPackets
流中,就可以解决这个问题。

问题是水印。在这种情况下,您只将水印赋值给其中一个流,当给定运算符的输入上有多个流时,Flink总是选择最低的水印

因此,在您的情况下,Flink必须在
数据包生成的水印和广播流生成的水印之间进行选择,其中一个水印总是
Long.MinVal
(因为控制流没有水印生成器),所以它总是选择
Long.MinVal
,因此windows永远不会运行

在这种情况下,只需将水印赋值器添加到
gwEnrichedPackets
流中,就可以解决这个问题

//  val sessionWindows = gwEnrichedPackets - NOT works
//  val sessionWindows = packets - Works

val sessionWindows = gwEnrichedPackets
  .keyBy(_.tag.tagId)
  .timeWindow(Time.seconds(20))
  //.window(EventTimeSessionWindows.withGap(Time.seconds(120)))
  //.allowedLateness(Time.seconds(12000))
  //.sideOutputLateData(new OutputTag[MAINDATACLASS]("late-readings"))
  .process(new DetectTagGatewayDisconnections)

val lateStream = sessionWindows
  .getSideOutput(new OutputTag[MAINDATACLASS]("late-readings"))

lateStream.print()
sessionWindows.print()