【发布时间】:2017-08-25 20:07:23
【问题描述】:
问题背景
我正在尝试从实时流中为每个键生成事件项的总(线性)顺序,其中顺序是事件时间(源自事件有效负载)。
方法
我曾尝试使用流式实现此功能,如下所示:
1) 设置一个不重叠的顺序窗口,例如时长 5 分钟
2) 建立允许的迟到 - 丢弃迟到的事件是可以的
3) 设置累积模式以保留所有触发的窗格
4) 使用“AfterwaterMark”触发器
5) 处理触发窗格时,仅考虑最后一个窗格
6) 使用 GroupBy.perKey 确保此窗口中此键的所有事件都将作为单个资源上的一个单元进行处理
虽然这种方法可以确保给定窗口内每个键的线性顺序,但它不能保证跨多个窗口,例如可能有一个键的事件窗口,之后发生的事件与之前的窗口同时处理,如果第一个窗口失败并且必须重试,这很容易发生。
我正在考虑采用这种方法,首先可以处理实时流,以便通过键对事件进行分区并将它们写入由窗口范围命名的文件。 由于光束处理的并行性质,这些文件也会乱序生成。 然后,单个流程协调器可以将这些文件按顺序提交到批处理管道 - 只有在收到前一个文件并且下游处理已成功完成时才提交下一个。
问题是 Apache Beam 只会在该时间窗口中至少有一个时间元素时触发一个窗格。因此,如果事件中存在间隙,则生成的文件中可能存在间隙 - 即丢失文件。丢失文件的问题在于,协调批处理器无法区分是否知道时间窗口已经过去而没有数据,或者在这种情况下它无法继续直到文件最终到达。
强制触发事件窗口的一种方法可能是以某种方式将虚拟事件添加到每个分区和时间窗口的流中。但是,这很难做到……如果时间序列中有很大的差距,那么如果这些虚拟事件发生在很晚的事件周围,那么它们将被视为迟到而被丢弃。
是否有其他方法可以确保每个可能的事件窗口都有一个触发器,即使这会导致输出空文件?
从实时流中通过键生成总排序是 Apache Beam 的一个易于处理的问题吗?我应该考虑另一种方法吗?
【问题讨论】:
标签: google-cloud-dataflow apache-beam