Google cloud dataflow 使用Python SDK连接多个流

Google cloud dataflow 使用Python SDK连接多个流,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我希望在一个公共密钥上加入多个流,并在所有流至少贡献一个元素后或在窗口末尾触发结果。CoGroupByKey似乎是合适的构建块,但似乎没有一种方法来表达早期触发条件(计数触发器适用于每个输入集合)我相信CoGroupByKey是作为flatte+GroupByKey在引擎盖下实现的。一旦将多个流展平为一个流,数据驱动触发器(或任何其他触发器)将没有足够的控制来实现您想要的 您可以使用plant和StatefulDoFn为每个键填充由State支持的对象,而不是使用CoGroupByKey。同样在

我希望在一个公共密钥上加入多个流,并在所有流至少贡献一个元素后或在窗口末尾触发结果。CoGroupByKey似乎是合适的构建块,但似乎没有一种方法来表达早期触发条件(计数触发器适用于每个输入集合)

我相信
CoGroupByKey
是作为
flatte+GroupByKey
在引擎盖下实现的。一旦将多个流展平为一个流,数据驱动触发器(或任何其他触发器)将没有足够的控制来实现您想要的


您可以使用
plant
StatefulDoFn
为每个键填充由
State
支持的对象,而不是使用
CoGroupByKey
。同样在这种情况下,
StatefulDoFn
将有机会决定当流A有2个元素到达但流B还没有任何元素时该做什么。

另一个可能的解决方案是(无状态)DoFn,它过滤CoGBK结果,以删除每个连接流中至少没有一次出现的结果。对于窗口结束结果(没有相同的限制),则需要有一个并行CoGBK,其结果将不会通过过滤器。我认为没有办法用发出结果的触发器标记结果?

使用Java SDK时,这绝对是最好的解决方案!用户状态和定时器功能非常强大,可以解决这一问题,以及许多其他在更高级别的窗口中很难/不实用的用例。但不幸的是,Python SDK中还没有对有状态DoFn的支持。您可能可以借助一些外部存储(例如bigtable)执行连接?是的,将无状态函数与外部存储一起使用可能是一种解决方法。如果您知道每个流中每个键最多有一个元素,您可以首先触发它(AfterCount(N),EndOfWindow)。数据驱动触发器的目的是泛化AfterCount以接受任意的T->Boolean组合器,当实现该组合器时,可以将AfterCount(N)替换为等待所有N个独立流至少有一个元素的东西(尽管如果顺序是e1、e2、e1而不是双向连接的e1、e1、e2,这会变得很棘手)。您也可以使用自定义窗口fn执行此操作,如会话,但在窗口“已满”(即每个流都有代表)时,将窗口的结尾提前移动。这仅在触发器和处理逻辑与使用累积触发器兼容时才有效。这允许您拥有一个无状态DoFn,它过滤所有在每个流上至少没有一个元素的早期触发。我不确定Python中的PaneInfo是否公开了它是早、准时还是晚。你最终做了什么?我们首先使用CoGroupByKey实现了一个新的答案,但是缺乏早期触发的能力(仅在水印上)。但是现在,Python SDK中增加了对状态和计时器的支持,我们正在使用的Flink runner(Beam release 2.9)也支持它。所以我们将切换到基于状态和计时器的实现。哇,好消息,文档仍然说并非所有运行人员都支持Python状态和计时器API。感谢您指出这一点,我在发行说明中看到了这一点。我正在使用DataflowRunner,希望它能很快增加支持。有状态处理将改变游戏规则