Apache flink Flink:通过密钥进行有状态流处理
我有一些数据流,比如ID为的JSON记录 我希望处理数据,使具有相同密钥的所有记录都由相同的有状态任务处理Apache flink Flink:通过密钥进行有状态流处理,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我有一些数据流,比如ID为的JSON记录 我希望处理数据,使具有相同密钥的所有记录都由相同的有状态任务处理 我如何才能做到这一点?这可以通过KeyedStream上的有状态运算符来实现。KeyedStream对一个键上的所有记录进行分区,并确保具有相同键的所有记录进入相同的操作员实例,并与相同的状态交互 在代码中,这看起来像: val stream: DataStream[(String, Long)] = ??? val sumByKey: DataStream[(String, Long)]
我如何才能做到这一点?这可以通过
KeyedStream
上的有状态运算符来实现。KeyedStream
对一个键上的所有记录进行分区,并确保具有相同键的所有记录进入相同的操作员实例,并与相同的状态交互
在代码中,这看起来像:
val stream: DataStream[(String, Long)] = ???
val sumByKey: DataStream[(String, Long)] = stream
.keyBy(_._1) // key on the first attribute
.map(new SumMapper())
class SumMapper extends RichMapFunction[(String, Long), (String, Long)] {
var sumState: ValueState[Long] = _
override def open(config: Configuration) {
// configure state
val sumDesc: ValueStateDescriptor[Long] =
new ValueStateDescriptor[Long]("sum", classOf[Long])
sumState = getRuntimeContext.getState(sumDesc)
}
override def map(in: (String, Long)): (String, Long) = {
val sum = sumState.value() // get current sum from state
val newSum = sum + in._2 // compute new sum
sumState.update(newSum) // update state
(in._1, newSum) // emit result
}
}