Google cloud platform ApacheBeam中afterwatermark触发器和默认触发器的区别是什么?
根据apachebeam文档 AfterWatermark触发器在事件时间运行。后水印 触发器在水印通过后发出窗口内容 窗口结束,基于附加到数据的时间戳 元素。水印是一个全局进度度量,是Beam的 在任何给定点,管道中输入完整性的概念。 AfterWatermark仅在水印经过 窗户 PCollection的默认触发器基于事件时间,并且 当光束的水印通过窗口时,发射窗口的结果 窗口结束,然后在每次延迟数据到达时激发。 但是,如果同时使用默认窗口配置和 默认触发器,默认触发器只发出一次,并且延迟 数据被丢弃 我尝试实现这两种方法,并使用固定窗口获得类似的输出 带后水印触发器:Google cloud platform ApacheBeam中afterwatermark触发器和默认触发器的区别是什么?,google-cloud-platform,triggers,google-cloud-dataflow,apache-beam,Google Cloud Platform,Triggers,Google Cloud Dataflow,Apache Beam,根据apachebeam文档 AfterWatermark触发器在事件时间运行。后水印 触发器在水印通过后发出窗口内容 窗口结束,基于附加到数据的时间戳 元素。水印是一个全局进度度量,是Beam的 在任何给定点,管道中输入完整性的概念。 AfterWatermark仅在水印经过 窗户 PCollection的默认触发器基于事件时间,并且 当光束的水印通过窗口时,发射窗口的结果 窗口结束,然后在每次延迟数据到达时激发。 但是,如果同时使用默认窗口配置和 默认触发器,默认触发器只发出一次,并且延迟
lines |'timestamp' >> beam.Map(get_timestamp)
| 'window' >> beam.WindowInto(
window.FixedWindows(20),
trigger=trigger.AfterWatermark(),
accumulation_mode=trigger.AccumulationMode.DISCARDING
)
| 'CountGlobally' >> beam.CombineGlobally(
beam.combiners.CountCombineFn()
).without_defaults()
| 'printnbrarticles' >> beam.ParDo(PrintFn())
| 'jsondumps' >> beam.Map(lambda x: json.dumps(x))
| 'encode' >> beam.Map(lambda x: x.encode('utf-8'))
| 'send_to_Pub/Sub' >> beam.io.WriteToPubSub(known_args.out_topic)
)
使用默认触发器:
lines |'timestamp' >> beam.Map(get_timestamp)
| 'window' >> beam.WindowInto(
window.FixedWindows(20),
)
| 'CountGlobally' >> beam.CombineGlobally(
beam.combiners.CountCombineFn()
).without_defaults()
| 'printnbrarticles' >> beam.ParDo(PrintFn())
| 'jsondumps' >> beam.Map(lambda x: json.dumps(x))
| 'encode' >> beam.Map(lambda x: x.encode('utf-8'))
| 'send_to_Pub/Sub' >> beam.io.WriteToPubSub(known_args.out_topic)
)
您没有看到差异,因为您没有最新的数据。如文档中所述,Afterwatermark仅在水印之后触发一次,默认触发器在水印之后调用,并且在每次延迟数据到达时调用 此外,使用Afterwatermark触发器,您可以配置早期数据(数据在窗口打开之前到达)或延迟数据(在水印之后到达)的其他行为(和调用) 无法使用默认触发器自定义此设置