Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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
Redis 幻灯片尺寸小、内容相同的Flink窗口的优化?_Redis_Apache Flink - Fatal编程技术网

Redis 幻灯片尺寸小、内容相同的Flink窗口的优化?

Redis 幻灯片尺寸小、内容相同的Flink窗口的优化?,redis,apache-flink,Redis,Apache Flink,我们开发了一个Flink应用程序,它接收具有Flink应用程序中的id、value1、value2、等字段的消息,这些消息由id键入,并分配不同大小的滑动窗口和10秒的slide。我们使用AggregateFunction为每个id计算一些统计信息,并将结果数据流放入Redis。代码如下所示: DataStream<Tuple2<String, String>> statistics = messages.keyBy(0) .timeWindow(Time.sec

我们开发了一个Flink应用程序,它接收具有Flink应用程序中的
id、value1、value2、
等字段的消息,这些消息由
id
键入,并分配不同大小的滑动窗口和10秒的
slide
。我们使用AggregateFunction为每个id计算一些统计信息,并将结果数据流放入Redis。代码如下所示:

DataStream<Tuple2<String, String>> statistics = messages.keyBy(0)
    .timeWindow(Time.seconds(300), Time.seconds(10))
    .aggregate(new Min5Aggregate())
    .setParallelism(20);

statistics.addSink(new CustomRedisSink()).setParallelism(20);
DataStream statistics=messages.keyBy(0)
.时间窗口(时间.秒(300),时间.秒(10))
.aggregate(新的Min5Aggregate())
.1(20);
statistics.addSink(newcustomredissink()).setParallelism(20);
通过这种方式,其他系统可以通过读取Redis来使用和显示统计数据,并且结果每10秒更新一次。但是现在我们在这个实现中遇到了性能问题。我认为其中一个原因是为一些ID创建了过多的窗口,这些ID没有非常活跃的值更新

假设窗口大小为300秒,并且有一个id每隔几小时才有新值。但每次该id的新值到达时,将创建30个(300s/10s)窗口,这些窗口具有相同的聚合输出,因为在它们过期之前没有更多的新值。我们现在做的是在对结果流进行蒙皮时将输出与Redis中的值进行比较,如果它们相同,则跳过更新

为了优化性能,我想知道在Flink中是否有任何方法可以阻止窗口触发火灾,因为它的内容与前面的窗口相同。这样就不需要与Redis进行比较了。或者,如果您对该系统有任何其他优化建议,也将非常有用


*由于还有其他ID具有频繁的值更新,并且我们需要有相当最新的统计信息,因此增加幻灯片大小将不是一个选择。

我不相信触发器可以保持前一个窗口的状态。
ProcessWindowFunction
可以保持早期窗口的状态,因此这是一个选项

一个相当简单的解决方案是在窗口和接收器之间插入一个
RichFlatMapFunction
,该函数记住以前的结果,并且仅当新结果不同时才生成输出

要获得更详细的滑动窗口优化,您可以将窗口实现为
KeyedProcessFunction
。这样,您可以将30个10秒的切片和完全聚合的结果保持300秒左右,然后每10秒只需减去最早的10秒,再加上最新的10秒。对于忙键,这应该比将每个事件添加到30个窗口中更有效——但是自己做所有的簿记工作肯定要多。弗林克文件包括:;滑动窗口的扩展留给读者