Apache flink Flink广播状态实现进程函数内的会话窗口

Apache flink Flink广播状态实现进程函数内的会话窗口,apache-flink,Apache Flink,我的flink应用程序设计用于处理来自传感器的物联网数据。 传感器通过网关发送数据。这就是示例数据的样子 案例类数据(传感器ID:String,值:Float,网关ID:String,时间戳:Long) 来自同一传感器的数据可以来自不同的网关 如果网关与网络断开连接,则我会收到一个关于此案例类GatewayEvents(gatewayId:String,event:String,timestamp:Long)的特殊事件,并使用从传感器连接到主数据流的广播流 在两种情况下,传感器可能不发送数据

我的flink应用程序设计用于处理来自传感器的物联网数据。 传感器通过网关发送数据。这就是示例数据的样子
案例类数据(传感器ID:String,值:Float,网关ID:String,时间戳:Long)
来自同一传感器的数据可以来自不同的网关

如果网关与网络断开连接,则我会收到一个关于此
案例类GatewayEvents(gatewayId:String,event:String,timestamp:Long)的特殊事件
,并使用从传感器连接到主数据流的广播流

在两种情况下,传感器可能不发送数据

  • 它坏了
  • 网关与网络断开连接(将接收广播流中的
    网关事件(“gwId”,“disconnected”,16179694)
    消息)
如果我收到某个网关与网络断开连接的消息,并且通过它发送数据的传感器停止发送数据(例如,在1分钟内),我需要创建一个特殊事件

我的半实现实现如下所示:

case class Data(sensorId: String, value: Float, gatewayId: String)
case class GatewayEvents(gatewayId: String, event: String, timestamp: Long)

val sensorData: DataStream[Data] ...
val gwData: DataStream[GatewayEvents] ...

val gatewayBroadcastStateDescriptor = new MapStateDescriptor[String, GatewayEvents]("gatewayEvents", classOf[String], classOf[GatewayEvents])
val broadcastGatewayEventsStream = gwData.broadcast(gatewayBroadcastStateDescriptor)

val events: sensorData.
  .keyBy(_.sensorId)
  .connect(broadcastGatewayEventsStream)
  .process(...)

无法执行此过程。有什么想法吗?我认为SessionWindows会对我有所帮助,但我不知道如何最好地做到这一点,因此,我认为最简单的方法是在这种情况下使用计时器。因此,基本上您可以实现
KeyedCoProcess
功能,如果它接收到
gatewaydepconnected
消息,您将注册定时器(处理时间)以在所需时间后触发。如果传感器收到任何消息,您只需删除已注册的计时器,这样它就不会触发。在
onTimer
函数中,您可以简单地发出所需的事件,因为如果计时器触发,则表示时间跨度中没有值


这里需要注意的一点是,如果您
keyBy(uu.sensorId)
,则表示将为通过该网关接收到的每个传感器生成事件。如果您只想为gatewa发出一个事件,您可以简单地将分区更改为
keyBy(uu.gatewayId)

,如果我理解正确的话。用例是
如果我让断开连接的事件等待1分钟(或任何时间),如果此时没有数据到达,则发出一些事件类型
?Yes@Dominikowosiński.Thank。我认为
KeyedCoProcess
应该解决我的用例。没有使用广播状态。我连接了我的
sensorData
gwData
,然后通过
.keyBy(u.sensorId,u.gatewayId)
键控,并应用了
键控协处理函数
。无法理解
.keyBy
在两个并行连接的流>1时如何工作?我可以连接键控流和非键控流吗?
keyBy
基本上意味着具有相同键的元素将由操作符的相同并行实例处理。因此,如果您使用
keyBy(u.sensorId)
,则具有
sensorId=1
的事件将始终由同一实例处理。谢谢,这很清楚。当有两个连接的流和
.keyBy(u.sensorId,u.gatewayId)
时,它是如何工作的?实际上是一样的:)它只是需要复合密钥。