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

用Apache Beam窗口-固定窗口似乎不关闭?

江天宇
2023-03-14

我们试图在Apache Beam管道上使用固定窗口(使用DirectRunner)。我们的流程如下:

  1. 从pub/sub中提取数据
  2. 反序列化JSON到Java对象
  3. 窗口事件w/固定窗口5秒
  4. 使用自定义的CompineFn,将事件的每个窗口合并成一个List

管道代码:

    pipeline
                // Read from pubsub topic to create unbounded PCollection
                .apply(PubsubIO
                    .<String>read()
                    .topic(options.getTopic())
                    .withCoder(StringUtf8Coder.of())
                )

                // Deserialize JSON into Event object
                .apply("ParseEvent", ParDo
                    .of(new ParseEventFn())
                )

                // Window events with a fixed window size of 5 seconds
                .apply("Window", Window
                    .<Event>into(FixedWindows
                        .of(Duration.standardSeconds(5))
                    )
                )

                // Group events by window
                .apply("CombineEvents", Combine
                    .globally(new CombineEventsFn())
                    .withoutDefaults()
                )

                // Log grouped events
                .apply("LogEvent", ParDo
                    .of(new LogEventFn())
                );

我们看到的结果是,最后一步永远不会运行,因为我们没有任何日志记录。

此外,我们还添加了系统。出来println(“***”)在我们自定义的CombineFn类的每个方法中,以便跟踪这些方法何时运行,而它们似乎也不运行。

这里的窗口设置有误吗?我们遵循了https://beam.apache.org/documentation/programming-guide/#windowing的一个例子,它看起来相当简单,但显然缺少一些基本的东西。

任何见解都值得赞赏-提前感谢!


共有1个答案

杜浩壤
2023-03-14

看起来主要问题确实是一个丢失的触发器——窗口正在打开,没有什么告诉它什么时候发出结果。我们想简单地根据流转时长(而不是事件时间)进行窗口,以下内容也是如此:

.apply("Window", Window
    .<Event>into(new GlobalWindows())
    .triggering(Repeatedly
        .forever(AfterProcessingTime
            .pastFirstElementInPane()
            .plusDelayOf(Duration.standardSeconds(5))
        )
    )
    .withAllowedLateness(Duration.ZERO).discardingFiredPanes()
)

本质上,这创建了一个全局窗口,在处理第一个元素5秒后触发该窗口以发出事件。每次窗口关闭时,另一个窗口在接收到元素后打开。Beam抱怨我们没有允许延迟的片段-据我所知,这只是告诉它忽略任何延迟数据。

在这里,我的理解可能有点离题,但上面的代码片段解决了我们的问题!

 类似资料:
  • 问题内容: 最终编辑: 我在关闭pyplot窗口这一主题上发现,实际上可能不应该使用pyplot完成它。SRK给出了一个很好的示例,说明如何处理将在下面的答案中更新的图。我也偶然发现了如何将pyplot图放到Tkinter窗口中,并且Tkinter比pyplot更擅长打开和关闭窗口。这里是怎样把一个pyplot情节变成Tk的窗口, /最终编辑 我希望能够显示多个图,然后能够从某些代码输入中分别关闭

  • 我刚刚花了相当多的时间来寻找pygame的64位安装,以便与Python3.3一起使用(这里),现在我正在尝试创建一个窗口。然而,尽管窗口打开得很好,但当它按下x按钮时并没有关闭。事实上,我必须关闭闲置关闭窗口。我正在运行Win7的64位版本。这是我的密码: 当我附加 它仍然没有关闭。我唯一的猜测就是那个游戏。退出可能会进入其中一个循环,但即使解决了这个问题,我还是更愿意在需要时关闭窗口。

  • 我写了一个小GUI程序与python在tkinter的窗口。我的窗口必须在全屏游戏窗口的前面。 此刻,我用这句话: 它适用于普通窗口(浏览器,浏览器,...),但如果我启动游戏到全屏模式,我的窗口隐藏在游戏后面。 为什么会发生这种情况?调用游戏可能类似于覆盖我的属性的? 我的问题还有别的解决办法吗?也许可以告诉windows,我的窗口应该在特定窗口(游戏窗口)的前面?

  • 所以我在使用android导航组件,我有一个问题(2.2.0-rc04版本)。 我有一个welcomeFragment(wF)。我想从wF导航到另一个导航图中的lSF。我也不想在导航到lSF时从backstack(poputto,popuptinclusive)中删除wF,因为用户可能想返回它。 导航到lSF后,后退如下所示:wF lSF 我们现在在lSF上,登录后我们想进入feedFragmen

  • 我创建了一个固定在页面底部的容器。但是,容器随后溢出页面,填充规则被完全忽略。我在论坛上搜索过,但找不到一个解决问题的方法。我试过使用position absolute,也试过使用Javascript计算滚动条宽度,但都没有用。 null null

  • 我在youtube上的视频中找到了一个教程,那个家伙正在运行以下代码: 如果event.type==pyplay。退出: 当我写“pygame.quit:”而不是“pygame.quit:”(在for循环中)时,窗口不会关闭。我完全是个初学者。这是我们必须大写的命令吗?有人能解释一下原因吗?