我用Python开发了一个示例光束管道,该管道从pubsub订阅中接收一些数据(数据元素是具有该年龄的人的名字,目的是计算固定窗口中有多少特定年龄的人)。
FixedWindow设置为30秒,无需其他配置。
问题是输出是随机触发的,在第一个输出之后,管道开始在当前窗口和下一个应该在60秒后发出结果的下一个窗口之间发出输出数据(例如5或6个输出)。
with beam.Pipeline(options=pipeline_options) as p:
data = p | ReadFromPubSub(topic=known_args.input, with_attributes=True, timestamp_attribute="timestamp")
transformed = (data
| 'FormatMessage' >> beam.Map(format_message)
| 'Add Timestamp: %s' >> beam.ParDo(AddTimestampDoFn())
| beam.WindowInto(window.FixedWindows(30))
| "Filter" >> beam.Filter(filter_names, known_args.rules)
| "ReMap" >> beam.Map(lambda x: (x['data']))
| beam.ParDo(CollectTimings())
| 'Group' >> beam.GroupByKey()
| 'Count' >> beam.CombineValues(beam.combiners.CountCombineFn())
)
serialized = (transformed
| beam.Map(lambda x: json.dumps(x))
| beam.Map(printresults)
)
serialized | "Write To PubSub" >> WriteStringsToPubSub(known_args.output)
据我了解,根据Beam文档,我应该每30秒接收一次输出(如果至少有一个输入数据),但是我在窗口内得到了多个输出。
这种行为可能是什么原因?