当写入接收器时必须保留事件时间顺序时,apache-beam 是一个不错的选择吗?
Is apache-beam a good choice when the event time ordering has to preserved when writing to sink?
我正在考虑使用 apache beam 编写一个流式管道,以应用突变流,按照事件时间的顺序将事件从源数据库复制到目标数据库。源可以是 kafka 或 pubsub。
一个例子类似于this,除了突变应用于接收器的顺序必须是它们到达的顺序。
我确实复习了之前关于保留顺序的一些问题:
- Sort elements within a fixed window - Cloud Dataflow - 这似乎是我感兴趣的相同用例。
我明白,如果我走 Apache Beam 路,我将不得不
- 选择一个 windowing 策略来适应迟到的数据(固定 windowing 策略允许迟到或全局 window,有触发器发出窗格和缓冲区对于迟到的数据)
- 应用转换
- GroupByKey 在单个键上(这样一切都交给同一个工人),排序并写入接收器
除了上述之外,我还必须确保 windows(如果我遵循固定的 window 策略)按顺序执行。第3步必然是瓶颈
如果以上步骤列表中的 [2] 是大量计算,那么 apache beam 将有意义地利用 beam 提供的并行性。但是,如果 [2] 只是一个简单的一对一映射,那么 apache beam 对于这个复制用例是否有意义。如果我遗漏了什么,请告诉我。
注意:我们确实有一个数据流批处理管道,使用 apache beam 将 gcs 上的数据转储加载到数据库,其中整个数据都在磁盘上,写入接收器的顺序无关紧要。
保留顺序是可能的,但不确定它是否简单或有效。
这还取决于您期望的数据量 (elements/sec) 以及接收器类型。可能你可以让管道将有序条目写出到 GCS,而接收器只是作为辅助进程按顺序读取文件。
你的另一个选择,使用并行写入并确保数据库仅在最后一个 Beam 阶段的输出水印时间之前可用,这可能是可行的,但不是真正的 Dataflow/Apache Beam 的核心用例.
也许有一些方法可以乱序处理流,但写入可以轻松按顺序读取的中间接收器。即用一个步骤或文件编号写出突变批次,当应用于最终接收器时可以很容易地用于对文件进行排序。
window + 写入最终接收器架构将很难正确处理,可能对于少量元素来说过于复杂,而对于大量元素来说效率太低。 This 是一个很好的例子。
但再次请记住,所有这些方法绝对不是 Dataflow/Apache Beam 的核心用例。
我正在考虑使用 apache beam 编写一个流式管道,以应用突变流,按照事件时间的顺序将事件从源数据库复制到目标数据库。源可以是 kafka 或 pubsub。
一个例子类似于this,除了突变应用于接收器的顺序必须是它们到达的顺序。
我确实复习了之前关于保留顺序的一些问题:
- Sort elements within a fixed window - Cloud Dataflow - 这似乎是我感兴趣的相同用例。
我明白,如果我走 Apache Beam 路,我将不得不
- 选择一个 windowing 策略来适应迟到的数据(固定 windowing 策略允许迟到或全局 window,有触发器发出窗格和缓冲区对于迟到的数据)
- 应用转换
- GroupByKey 在单个键上(这样一切都交给同一个工人),排序并写入接收器
除了上述之外,我还必须确保 windows(如果我遵循固定的 window 策略)按顺序执行。第3步必然是瓶颈
如果以上步骤列表中的 [2] 是大量计算,那么 apache beam 将有意义地利用 beam 提供的并行性。但是,如果 [2] 只是一个简单的一对一映射,那么 apache beam 对于这个复制用例是否有意义。如果我遗漏了什么,请告诉我。
注意:我们确实有一个数据流批处理管道,使用 apache beam 将 gcs 上的数据转储加载到数据库,其中整个数据都在磁盘上,写入接收器的顺序无关紧要。
保留顺序是可能的,但不确定它是否简单或有效。
这还取决于您期望的数据量 (elements/sec) 以及接收器类型。可能你可以让管道将有序条目写出到 GCS,而接收器只是作为辅助进程按顺序读取文件。
你的另一个选择,使用并行写入并确保数据库仅在最后一个 Beam 阶段的输出水印时间之前可用,这可能是可行的,但不是真正的 Dataflow/Apache Beam 的核心用例.
也许有一些方法可以乱序处理流,但写入可以轻松按顺序读取的中间接收器。即用一个步骤或文件编号写出突变批次,当应用于最终接收器时可以很容易地用于对文件进行排序。
window + 写入最终接收器架构将很难正确处理,可能对于少量元素来说过于复杂,而对于大量元素来说效率太低。 This 是一个很好的例子。
但再次请记住,所有这些方法绝对不是 Dataflow/Apache Beam 的核心用例。