是否有Apache Beam方法每10秒处理一次数据,同时继续读取数据?

问题描述 投票:-1回答:1

我已经建立了一个从文件中读取事件,进行求和/计数操作并将结果写入文件的管道。它几乎按预期工作。

PCollection<Event> input = pipeline.apply(TextIO.read().from("./home/out/**"))
.apply("ParseEventFn", ParDo.of(new ParseEventFn())).apply(Window<Event>into(SlidingWindows.of(Duration.standardSeconds(30))
.every(Duration.standardSeconds(10)))
.triggering(AfterWatermark.pastEndOfWindow())
.withAllowedLateness(Duration.ZERO)
.discardingFiredPanes());

PCollection<Event> ev = input.apply(new ExtractAndSum());

ev.apply(ParDo.of(new FormatAsStringFn()))
.apply(TextIO.write().to(."/home/in/")
.withWindowedWrites()
.withNumShards(3));

我的问题是,系统仅在读取所有事件(总和/计数)后才写入文件。

是否有办法将结果每10秒写入文件一次?不用等待处理所有事件。

java parallel-processing apache-flink apache-beam flink-streaming
1个回答
0
投票

为了在文件到达时不断读取文件,您可以看一下中列出的模式:

File processing patterns - Processing files as they arrive

对于FileIO,这是通过.continuously完成的,而Text.IO是通过.watchForNewFiles完成的。

您不需要触发器,您可以只使用Window.into,它将默认为EventTime,除非您使用.withoutputtimestamp将与包含数据的文件关联的时间相同。

© www.soinside.com 2019 - 2024. All rights reserved.