2017-02-13 85 views
0

我们正在运行处理多个输入流的Dataflow作业。其中一些是高流量,其中一些很少收到消息。我们使用包含与所有元素相关的信息的“共享”流来加入所有流。这是管道的一个简单的例子:Dataflow流水线在执行GroupBy之前等待来自所有流的元素

Pipeline Example

我注意到,工作不会产生任何输出,直到流包含一定的流量。

例如,假设Stream 1获得稳定的流量,而Stream 2在一段时间内不会产生任何消息。此时,作业的DAG将显示GroupByKey步骤中正在积累的元素,但是除此之外没有任何内容会传播。我还可以看到Flatten PCollections步骤显示图表左侧的输入元素,但不是正确的。当处理同一作业中的高流量流量低流量流时,这会产生问题,因为这将导致输出延迟达到Stream 2拾取消息所需的量。

我不确定观察结果是否正确,但我想问一下,这是一般的Flatten/GroupByKey如何工作,如果是这样,如果我们看到的问题可以通过构建管道。

(实施例作业ID:2017-02-10_06_48_01-14191266875301315728)

+0

你在那一步使用了什么样的窗口和触发器?即使没有流中的元素,您也应该能够配置您的窗口/触发器来工作。 – Pablo

+0

@Pablo'FixedWindows'和'Sessions'具有默认触发器和第二种情况下30分钟的间隔持续时间。 据我所知,我可以添加一个触发器,使用处理时间或过早添加的元素数量,但我想避免这种情况,因为这意味着某些会话将不完整(30分钟不活动可能没有通过)当面板被触发时。 – livathinos

回答

1

作为group-by-key文档的默认行为是在窗口内等待所有数据已经​​到达描述 - 这是必要的,以确保正确性的下游结果。

根据您正在尝试执行的操作,您可能可以使用triggers来使得聚合输出更早。

您也可以使用慢速流作为side-input来处理快速流。

如果你仍然陷入困境,如果你能够更详细地描述流的内容以及你如何使用它们,这将有所帮助,因为更详细的答案取决于目标。

+0

这是否意味着如果其中一个流没有产生任何数量的元素,那么'GroupByKey'将等待,直到每个流至少有一个元素才能知道它需要关闭'Session'?确切的用例是我试图实现一个用户会话,在这里我跟踪了大量消息类型(点击,页面浏览等)的用户活动。某些会话可能包含所有流的元素(例如,用户点击了某个内容并查看了一个页面),但有些可能不会。 – livathinos

+0

这项工作目前正在消耗20个不同的流,其中一部分流程有资格被认为是“缓慢”或根本不传播元素。我认为使用侧面输入可能不是要走的路,因为它可能是任何一个流传输失败或缓慢的流。 我也在考虑错误配置的情况:假设由于某种原因,我的一个订阅由于配置错误而无法发送消息,或者消息可能不会再传播给它。这是否意味着管道会无限期地保持会话窗口? – livathinos

+0

实际行为取决于上游来源如何跟踪水印。例如,如果没有数据到达,PubSub源将允许水印前进到当前时间。但是,CoGroupByKey步骤需要等到所有上游源的水印已经超过固定窗口的末端等等 –