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

Apache Beam:使用固定窗口从无限源读取

微生智刚
2023-03-14

我有一个生成N个项目的UnboundedSource(它不是批处理模式,它是一个流——它只生成一定数量的项目,然后停止发出新项目,但仍然是一个流)。然后我将某个PTransform应用于我从该源获得的集合。我还应用了Window.into(FixedWindows.of(...))转换,然后使用组合按窗口对结果进行分组。所以它有点像这样:

pipeline.apply(Read.from(new SomeUnboundedSource(...)) // extends UnboundedSource
  .apply(Window.into(FixedWindows.of(Duration.millis(5000))))
  .apply(new SomeTransform())
  .apply(Combine.globally(new SomeCombineFn()).withoutDefaults())

我假设这意味着5秒钟内会生成新事件,然后对5秒钟窗口中的数据应用SomeTransform,然后轮询并生成一组新数据。相反,所有N个事件都是首先生成的,只有在生成之后,才会对数据应用SomeTransform(但窗口按预期工作)。它应该这样工作吗?Beam和/或runner(我使用的是Flink runner,但Direct runner似乎表现出相同的行为)是否有某种队列,在将项目传递给下一个操作员之前,它会在其中存储项目?这是否取决于使用哪种类型的无界源?就我而言,这是一种发电机。有没有办法达到我所期望的行为,还是不合理?一般来说,我对流式管道的工作非常陌生,更不用说梁了。然而,我认为,首先从源代码中读取所有内容是不合逻辑的,因为它是无限的。

共有1个答案

汤博
2023-03-14

需要注意的重要一点是,Beam中的窗口是根据事件时间而不是流转时长运行的。向数据添加5秒窗口不是规定数据应该如何处理的方法,只是该处理的聚合的最终结果。此外,窗口仅在到达聚合后影响数据,例如您的Combine.globally。在管道中的那一点之前,您应用的窗口没有任何效果。

至于它是否应该以这种方式工作,梁模型没有指定任何特定的处理行为,因此其他跑步者处理图元的方式可能略有不同。然而,这仍然是一个正确的实现。它并不是试图从源代码中读取所有内容;通常,Beam中的流媒体源将在继续并稍后返回源之前尝试读取所有可用元素。如果您要在很长一段时间内缓慢地调整流到流中的元素,您可能会在从源代码读取之间看到更多的处理。

 类似资料:
  • 我们试图在Apache Beam管道上使用固定窗口(使用)。我们的流程如下: 从pub/sub中提取数据 反序列化JSON到Java对象 窗口事件w/固定窗口5秒 使用自定义的,将事件的每个窗口合并成一个

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

  • 我正在为一个小项目尝试一些Java的套接字编程。我遇到了从外部进程读取无限InputStream的问题。程序进入无限循环。 我怀疑readLine()必须在EOF之前读取流。 我放了一些打印语句,我确信程序达到了while循环。 这是我的方法:

  • 我有以下前缀: 有办法 在intellij中,idea工作正常,但启动jar时出现错误: JAVA尼奥。文件NoSuchFileException:文件:/app。罐子/BOOT-INF/classes/模板/请求订单/未标记/请求订单未标记。pdf

  • 我有以下用例,如果有明显的解决方案,很抱歉,但我对Flink非常陌生: 谢谢

  • 没有工具栏或任何边框仅纯内容的窗口. 创建无框窗口 在 BrowserWindow的 options中设置 frame 为 false 即可创建无框窗口. 1 const {BrowserWindow} = require('electron') 2 let win = new BrowserWindow({width: 800, height: 600, frame: false}) 3 win