Apache flink Flink窗口在连接到广播流后不会启动
我尝试使用BroadcastStatePattern来扩展应用程序的功能。 这里有一些代码<代码>主代码Apache flink Flink窗口在连接到广播流后不会启动,apache-flink,Apache Flink,我尝试使用BroadcastStatePattern来扩展应用程序的功能。 这里有一些代码主代码 // .... /// val gatewayBroadcastStateDescriptor = new MapStateDescriptor[String, BCA]("gatewayEvents", classOf[String], classOf[BCASTDATACLASS]) // Broadcast source val broadcastSource = en
// .... ///
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)
Mywindow
函数(在本例中不做任何操作,只需进一步转发数据)
连接数据和配置流之后,我将打开窗口并进行一些处理。
但当我从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()