Google cloud dataflow 究竟是什么管理beam中的水印?

Google cloud dataflow 究竟是什么管理beam中的水印?,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,Beam的强大功能来自它的高级窗口功能,但它也有点令人困惑 在本地测试(我使用rabbitmq作为输入源)中看到了一些奇怪的情况,消息并不总是得到ackd,并且修复了不总是关闭的窗口,我开始在StackOverflow和Beam代码库中挖掘 对于何时设置水印,似乎存在特定于源代码的问题: RabbitMQ水印不前进: PubSub水印不适用于低容量: SQS IO不会在没有新传入消息的时间段内推进水印- (和其他)。此外,检查点s(检查点s)似乎有独立的概念,与水印相反 所以我想这是一个多部

Beam的强大功能来自它的高级窗口功能,但它也有点令人困惑

在本地测试(我使用rabbitmq作为输入源)中看到了一些奇怪的情况,消息并不总是得到
ack
d,并且修复了不总是关闭的窗口,我开始在StackOverflow和Beam代码库中挖掘

对于何时设置水印,似乎存在特定于源代码的问题:

  • RabbitMQ水印不前进:
  • PubSub水印不适用于低容量:
  • SQS IO不会在没有新传入消息的时间段内推进水印-
(和其他)。此外,
检查点
s(
检查点
s)似乎有独立的概念,与
水印
相反

所以我想这是一个多部分的问题:

  • 什么代码负责移动水印?它似乎是源代码和运行程序的某种组合,但我似乎无法找到它来更好地理解它(或者为我们的用例调整它)。这对我来说是一个特别的问题,因为在低容量期间,水印永远不会前进,消息也不会
    ack
    d
  • 我没有看到太多关于检查点/检查点标记概念的文档(非代码束文档没有讨论它)。检查点标记如何与水印交互(如果有的话)
  • 每个PCollection都有自己的水印。水印指示特定PCollection的完整程度。源负责其生成的PCollection的水印。水印向下游PCollection的传播是自动的,无需额外的近似;它可以大致理解为“输入PCollections和缓冲状态的最小值”。因此,在您的情况下,需要查看
    RabbitMqIO
    以查找水印问题。我不熟悉这个特定的IO连接器,但是如果您还没有这样做,那么向用户列表发送错误报告或电子邮件会很好
  • 检查点是一段源特定的数据,它允许它在不丢失消息的情况下恢复读取,只要检查点由运行程序持久保持。消息ACK往往发生在检查点终结中,因为运行程序在知道消息永远不需要重新读取时调用此方法

  • 啊,我明白了。看起来RabbitMqIO的阅读器故意将这两个概念混为一谈(返回的水印是检查点标记最早的时间戳)。我相信我现在看到了我想报告的“错误”,例如PubsubIO为在不活动期间推进水印做了规定,而Rabbit没有,如果没有新的消息通过,消息可能会被“卡住”。(我所说的“被卡住”是指在看到阈值消息之前,固定窗口永远不会“按时”启动。)我将对此进行记录。事实证明,我几乎所有的困惑都是由于默认RabbitMqIO的无限源实现中出现了一些意外的实现选择。我已经记录了他们,并进行了调查。谢谢