Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka Flink和非关键帧窗口状态_Apache Kafka_Stream_Apache Flink_Apache Kafka Streams_Flink Streaming - Fatal编程技术网

Apache kafka Flink和非关键帧窗口状态

Apache kafka Flink和非关键帧窗口状态,apache-kafka,stream,apache-flink,apache-kafka-streams,flink-streaming,Apache Kafka,Stream,Apache Flink,Apache Kafka Streams,Flink Streaming,我正在创建一个Flink应用程序,它只需将带窗口的传入卡夫卡事件转发到另一个卡夫卡主题,并为每个窗口添加开始和结束标记-例如,对于包含1,2,3,4,5的1小时窗口,我将下沉 start\u timestamp,1,2,3,4,5,end\u timestamp插入不同的卡夫卡主题。以后可能会有一些其他的转换,但一般来说,对于N个事件,我总是会发出至少N+2个事件 据我所知,将windowAll()与ProcessAllWindowFunction一起使用,以注入开始和结束标记,应该可以做到这一

我正在创建一个Flink应用程序,它只需将带窗口的传入卡夫卡事件转发到另一个卡夫卡主题,并为每个窗口添加开始和结束标记-例如,对于包含
1,2,3,4,5
的1小时窗口,我将下沉
start\u timestamp,1,2,3,4,5,end\u timestamp
插入不同的卡夫卡主题。以后可能会有一些其他的转换,但一般来说,对于N个事件,我总是会发出至少N+2个事件

据我所知,将
windowAll()
ProcessAllWindowFunction
一起使用,以注入开始和结束标记,应该可以做到这一点。
我的问题是关于国家管理的。我将使用RocksDb状态后端-即使对于这个非键控流,它也会保持内部窗口状态吗?我主要关心的是能够将状态保持在窗口中,这样我就不会再重新处理它,特别是对于大型窗口。

对于这样简单的事情,我会使用一个
FlatMap
(并行度设置为1),它将当前窗口的时间和上次事件时间保持在状态。每当记录到达时,如果它在新的每小时窗口中,我会发出
end\u时间戳
(上次事件时间),
start\u时间戳
(来自新记录),并更新保存状态的当前小时。在所有情况下,状态中的最后事件时间也会更新。这假设传入的事件是严格有序的,因此您不必担心延迟数据。

对于这么简单的事情,我将使用一个
平面图(并行度设置为1),它将保持当前窗口的时间和最后一个事件时间的状态。每当记录到达时,如果它在新的每小时窗口中,我会发出
end\u时间戳
(上次事件时间),
start\u时间戳
(来自新记录),并更新保存状态的当前小时。在所有情况下,状态中的最后事件时间也会更新。这假设您的传入事件是严格有序的,因此您不必担心延迟数据。

我更喜欢@kkrugler的方法,因为它将避免保持所有状态的成本。但要回答您的问题,是的,
windowAll
可以使用RocksDB状态后端来保存其内容。发动机罩下的
车窗all
实际上是一个带钥匙的车窗,带有一个特殊的恒定钥匙。因此,尽管RocksDB只能用于管理键控状态,但它是有效的。

我更喜欢@kkrugler的方法,因为它可以避免保持所有状态的成本。但要回答您的问题,是的,
windowAll
可以使用RocksDB状态后端来保存其内容。发动机罩下的
车窗all
实际上是一个带钥匙的车窗,带有一个特殊的恒定钥匙。因此,即使RocksDB只能用于管理键控状态,它也能工作。

请您详细说明,我不太确定您将状态保留在窗口中是什么意思。因此,假设我的管道只是
stream.map(object->object.incrField1()).windowAll(1.hour).process(MyProcessor())
。然后,据我所知,MyProcessor作为一个Iterable不断累积的状态将只是field1递增时出现的对象的原始列表。请您详细说明一下,我不太确定将状态保留在窗口中是什么意思。因此,假设我的管道只是
stream.map(object->object.incrField1()).windowAll(1.hour).process(MyProcessor())
。然后,据我所知,MyProcessor作为Iterable不断累积的状态将只是field1递增时出现的对象的原始列表。