Scala 状态存在时FlatMapGroupWithState行为
如果在设置新状态(带过期)后,组在初始过期之前的后续时间内被“调用”,则Spark group state永不过期 我正在为任何组状态设置“5秒”超时。如果我发送一个创建新状态的事件并等待5秒钟,则组将成功超时。但是,如果我发送了一个创建新状态的事件,并且发送了一个同样属于同一组的类似事件,则该组状态永远不会超时 //主课Scala 状态存在时FlatMapGroupWithState行为,scala,apache-spark,spark-streaming,spark-structured-streaming,Scala,Apache Spark,Spark Streaming,Spark Structured Streaming,如果在设置新状态(带过期)后,组在初始过期之前的后续时间内被“调用”,则Spark group state永不过期 我正在为任何组状态设置“5秒”超时。如果我发送一个创建新状态的事件并等待5秒钟,则组将成功超时。但是,如果我发送了一个创建新状态的事件,并且发送了一个同样属于同一组的类似事件,则该组状态永远不会超时 //主课 val aggregation = inputStream .groupByKey(r => r.key) .flatMapGroups
val aggregation = inputStream
.groupByKey(r => r.key)
.flatMapGroupsWithState(OutputMode.Append, GroupStateTimeout.ProcessingTimeTimeout)(Aggregator.aggregate)
//在另一个文件中的另一个对象中
object Aggregator {
def aggregate(key: String,
rows: Iterator[InputSchema],
state: GroupState[List[InputSchema]]): Iterator[InputSchema] = {
if (state.hasTimedOut) {
print("time out")
val output = state.get
state.remove()
return output.toIterator
}
if (state.exists) {
println("exists")
state.update(state.get ++ rows.toList)
return Iterator()
}
println("coming to update")
state.update(rows.toList)
state.setTimeoutDuration("5 seconds")
Iterator()
}
}
使用上述代码,将发生以下情况
1) 如果我在r.key
为12345
的位置发送消息
- 打印消息
已打印即将更新
- 5秒后,将打印
超时
r.key
为abcd
,然后当t2-t1小于5秒时(这是最初设置的组超时),我在t2发送相同的消息,则会发生以下情况-
- 打印消息
即将更新
已打印(这是t1的第一个事件)
- 打印消息
存在
在t2打印
- 即使在等待5秒钟后,状态也不会超时,我也不会得到
超时
打印
预期的行为应该是从t1开始5秒后,状态应该超时