【问题标题】:How can you replay old data into dataflow via pub/sub and maintain correct event time logic?如何通过 pub/sub 将旧数据重播到数据流中并保持正确的事件时间逻辑?
【发布时间】:2017-03-16 04:51:33
【问题描述】:

我们正在尝试使用数据流的处理时间独立性来启动一个新的流作业并通过 Pub/Sub 将我们的所有数据重播到其中,但遇到了以下问题:

管道的第一阶段是对事务 id 的 groupby,会话窗口为 10 秒,丢弃已触发的窗格,并且不允许延迟。因此,如果我们没有指定重播 pub/sub 主题的 timestampLabel,那么当我们重播到 pub/sub 时,所有事件时间戳都是相同的,并且 groupby 会尝试将我们所有的存档数据一直分组到事务 id 中。不好。

如果我们将 timestampLabel 设置为存档数据中的实际事件时间戳,并在 pub/sub 主题中一次重播 1d 次,那么它适用于第一天的事件,但只要这些是已用尽重播发布/订阅的数据水印会以某种方式向前跳转到当前时间,并且所有后续重播天数都将作为延迟数据丢弃。我真的不明白为什么会这样,因为它似乎违反了数据流逻辑独立于处理时间的想法。

如果我们将 timestampLabel 设置为存档数据中的实际事件时间戳,并将其全部重播到 pub/sub 主题中,然后启动流式作业来消费它,数据水印似乎永远不会前进,并且groupby 似乎没有任何结果。我也不太明白这是怎么回事。

【问题讨论】:

  • 您能否澄清一下您使用什么将历史数据写入 pubsub,有多少数据,您是按事件时间顺序还是按任意顺序写入数据?此外,对于您的方法 #2 或 #3,查看太慢的作业的作业 ID 会有所帮助。
  • 最初我们有一个批处理作业,它从 bq 表中读取数据并将其写入 pub/sub。在那之后不起作用(我们假设因为同一时间戳上有太多数据)我们将其更改为运行一系列批处理作业,一次重播一天,因为这是我们唯一能找到从 bq 读取的以任何顺序。所以它在一天之内是任意顺序的,但是天是有序的。我正在查看的当前运行已归档大约 100 万个事件,但一旦投入生产,它将达到数十亿。方法 #2 的作业 ID 是 2016-11-02_11_05_48-11273762957648435844 仍在运行

标签: google-cloud-dataflow apache-beam


【解决方案1】:

您的方法 #2 和 #3 存在不同的问题:

方法 #3(写入所有数据,然后开始消费):由于数据是乱序写入 pubsub 主题的,因此在所有(或大部分)数据被消费之前,水印确实无法前进 - 因为水印是一个软保证“您收到的其他项目不太可能有晚于此的事件时间”,但由于无序发布,发布时间和事件时间之间没有任何对应关系。因此,您的管道实际上会卡住,直到它处理完所有这些数据。

方法 #2:从技术上讲,它在每一天都会遇到同样的问题,但我想 1 天内的数据量并没有那么大,所以管道能够处理它。但是,在那之后,pubsub 频道会长时间保持空白,在这种情况下,PubsubIO 的当前实现会将水印提前到实时,这就是为什么更多天的数据被声明为延迟的原因。 The documentation 对此进行了更多解释。

一般来说,快速赶上大量积压,例如通过使用历史数据来“播种”管道,然后继续流入新数据,这是我们目前不能很好地支持的一个重要用例。

同时我有几个建议给你:

  • (更好)使用方法 #2 的变体,但尝试根据流管道对其进行计时,这样 pubsub 通道就不会保持为空。
  • 使用方法 #3,但需要更多工作人员和每个工作人员更多的磁盘(您当前的工作似乎是使用最多 8 个工作人员的自动缩放 - 尝试更大的东西,比如 100 个?它赶上后会缩小规模)

【讨论】:

  • 很好的信息,谢谢。我不知道为什么我没有检查 javadocs,但我可以建议将链接添加到该部分或在此处添加信息吗? cloud.google.com/dataflow/model/…我忘了提到方法#3 仍然是一次重放 1 天,所以它应该是大致订购的。我猜这还不够。我想我有足够的能力去想一些至少现在可以工作的东西
  • 旁白:当一个工作决定重置到现在的水印时间少于启动一个新工作所需的时间时,做“时间”的事情是非常困难的写入下一个数据块 =/
  • 嗯,根据数据量,您也许可以使用 DirectRunner 在本地计算机上运行“发布者”作业。虽然我猜这并不能消除 BigQuery 导出延迟。
  • 绝对不会,这将是数百场演出。另外,请澄清一下,如果我在方法#3 中以顺序运行天数缓冲 pub/sub 中的所有行,为什么这不起作用?这些行不是按照它们写的大致顺序出现的吗?我想看到大量积压的发布/订阅数据的工作会吸引更多的读者?
  • 嗯,我想我不明白#2和#3之间的区别,你能再澄清一下吗?
猜你喜欢
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
  • 2016-10-05
  • 2019-07-03
  • 2020-01-30
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
相关资源
最近更新 更多