我需要延迟处理或发布文件名(文件)。 我正在寻找最佳选择。
目前,我有两个Apache Beam数据流和PubSub之间。第一个数据流从源中读取文件名,并将其发送到PubSub主题。另一个数据流将读取它们并进行处理。但是,我的用例是在源中创建实际文件至少1小时后开始处理/读取实际文件。
所以我有两个选择:
1)延迟发布消息以便立即处理消息,但要在好的/预期的时刻进行
2)延迟处理检索到的文件
像上面提到的,我正在寻找最佳解决方案。我不确定在Apache Beam中是否应该使用番石榴重试机制?还有其他想法吗?
答案 0 :(得分:2)
您可以通过发布作业中的触发/窗口配置来实现所需的功能。
然后,您可以定义一个窗口配置,在该配置中,直到经过1小时的延迟,触发器才触发。像这样:
Window.<String>into(FixedWindows.of(Duration.standardMinutes(1))
.triggering(AfterProcessingTime.pastFirstElementInPane()
.plusDelayOf(Duration.standardHours(1)))
请记住,您最终只能从事一项工作,除了坚持一个小时的状态外,什么也做不了。此外,以上内容仅基于处理时间,因此即使文件的实际创建时间足够长,它也可能会立即发出结果。
您可以将其优化为事件时间触发器,但是可能需要编写自己的代码才能为记录(文件名)分配时间戳。据我所知,Beam当前不具有读取文件创建时间的内置支持。例如,当通过TextIO
读取文件时,我注意到记录都被分配了默认的静态时间戳。您应该检查用于读取文件名的转换的细节,以查看它是否可能对您的目的有用。您还可以使用WithTimestamps
转换自行分配时间戳。