我已经建立了一个从文件中读取事件,进行求和/计数操作并将结果写入文件的管道。它几乎按预期工作。
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秒写入文件一次?不用等待处理所有事件。
为了在文件到达时不断读取文件,您可以看一下中列出的模式:
File processing patterns - Processing files as they arrive
对于FileIO,这是通过.continuously
完成的,而Text.IO是通过.watchForNewFiles
完成的。
您不需要触发器,您可以只使用Window.into,它将默认为EventTime,除非您使用.withoutputtimestamp将与包含数据的文件关联的时间相同。