当前位置: 首页 > 知识库问答 >
问题:

如何调试键控窗口上的多个触发事件

訾凯歌
2023-03-14

我的数据流来自一个定制的SourceFunction,它以确定性的顺序发出窗口大小的字符串序列。其目的是基于EventTime在keyedstream上创建滑动窗口,以便对累积的字符串进行处理。为了分配EventTime和水印,我将一个带有PeriodicWatermarks的赋值器附加到流。滑动窗口使用自定义ProcessWindowFunction进行处理。

env.setStreamTimeCharacteristic(EventTime)
val seqStream = env.addSource(Seqstream)
    .assignTimestampsAndWatermarks(SeqTimeStampExtractor())
    .keyBy(getEventtimeKey)
    .window(SlidingEventTimeWindows.of(Time.milliseconds(windowSize), Time.milliseconds(slideSize)))

val result = seqStream.process(ProcessSeqWindow(target1))

My AssignerWithPeriodicWaterMarks 看起来像这样:

class FASTATimeStampExtractor : AssignerWithPeriodicWatermarks<FASTAstring> {
    var waterMark  = 9999L
    override fun extractTimestamp(element: FASTAstring, previousElementTimestamp: Long): Long {
        return element.f1
    }

    override fun getCurrentWatermark(): Watermark? {
        waterMark += 1
        return Watermark(waterMark)
    }
}

换句话说,源发出的每个元素都应该有自己的EventTime,并且应该发出水印,在该时间内不允许发生其他事件。在调试器中单步遍历流,表示生成了预期的EventTime/WatComments。

我的期望是ProcessSeqWindow.run()应该在EventTime上使用与时间窗口成比例的多个元素调用(例如10 ms)。然而,我观察到的是run()使用单个元素多次调用,并且相对于EventTime以任意顺序调用。当我将并行性强制为1时,行为仍然存在。我的问题是这是否可能是由每个窗口上的多个触发事件引起的,还是有其他可能的解释?我如何调试原因?

谢啦

共有1个答案

南宫俊喆
2023-03-14

水印在您的作业中的作用将是触发滑动事件时间窗口的关闭。为了正确发挥该作用,它们应该基于事件中的时间戳,而不是某个任意常量(9999L)。同一个对象负责提取时间戳并提供水印的原因是为了使该对象可以根据其对事件流中时间戳的观察来创建水印。因此,除非您的事件时间戳也基于递增类似的计数器,否则这可能会解释您看到的一些行为。

另一个问题是,虽然为每个事件调用extractTimestamp,但在定期水印分配器中,getCurrentWatermark方法每隔200毫秒(默认情况下)在单独的线程中调用一次。如果您希望在每个事件后都有水印,您将需要使用一个带有标点水印的assigner,尽管这样做有点反模式(因为有那么多水印会增加开销)。

如果你的时间戳是完全人为的,你可能会发现SlipingCountWindow更适合你正在做的事情。

 类似资料:
  • 问题内容: 我已经在窗口调整大小上注册了一个触发器。我想知道如何触发事件被调用。例如,当隐藏一个div时,我希望调用触发函数。 我发现可以触发该功能,但是还有其他解决方案吗? 问题答案: 在可能的情况下,我更喜欢调用函数而不是调度事件。如果您可以控制要运行的代码,则此方法效果很好,但是如果您不拥有该代码,请参见下文。 在此示例中,您可以在不调度事件的情况下调用该函数。 在现代浏览器中,您可以使用以

  • 我的总体目标是能够使用TAB键在3个div之间导航,每个div都有#sectionA、#sectionB和#sectionC的CSS id。在每个div中,我有一个无序列表,我想使用左右箭头键来浏览列表。 我的超文本标记语言如下: 到目前为止,我能够得到以下jquery代码,但一旦我添加了第二个$(文档). keydown(函数()代码,就无法工作。

  • 所以我有很多回购协议,有时我会忘记是否有一些回购协议没有完成,所以我想知道是否有一种方法可以在一次回购中为每一笔回购协议提供git pull。蝙蝠脚本。我在这里看到有人在linux上做这件事,我相信,但我在windows机器上。有人知道如何在windows上执行此操作吗?

  • 当我使用 flink 事件时间窗口时,窗口只是不触发。如何解决问题,有没有办法调试?

  • 我遇到了一个奇怪的JavaScript问题。我正在开发一个使用键盘输入的HTML5画布游戏。游戏的双人模式需要按住键盘上最多6个键。 在我按住键盘上的4或5个键后,似乎停止调用“keyDown”事件。 我使用的代码如下: 控制台应该为我按下的每个键记录一个键代码。然而,它似乎只报告我按住的前4或5个键的密码。这导致了当两个玩家按下太多键时,我的游戏的双玩家版本的控件无法工作。 这是一个bug,是J

  • 我有flink stream,我在某个时间窗口上计算一些事情,比如说30秒。 这里发生的事情是,它给我的结果,我以前的窗口聚合以及。 假设前30秒我得到结果10。 接下来的三十秒我想要新的结果,而不是我得到最后一个窗口的结果新的等等。 因此,我的问题是如何为每个窗口获得新的结果。