首页 > 解决方案 > 在 Dataflow 中处理一对多阶段的正确方法

问题描述

我有一个(Java)批处理管道,它遵循以下模式:

(FileIO)
(ExtractText > input=1 file, output=millions of lines of text)
(ProcessData)

ProcessData 阶段包含缓慢的部分(将数据与大白名单匹配)并且需要在多个工作人员上进行扩展,这应该不是问题,因为它只包含 DoFns。但是,我的一对多阶段似乎强制所有输出仅由一名工作人员处理(实例化更多工作人员会使它们除一个之外都处于空闲状态,或者如果启用了自动缩放则被缩小)。

基于其他 stackoverflow 条目,我尝试通过Reshuffle.viaRandomKey(). 这不起作用,因为Reshuffle包含一个GroupByKey将所有结果加载到内存中,导致OOM,即使我事先通过Window.<String>into(FixedWindows.of(Duration.standardSeconds(1)))

另一种选择是创建一个 CustomSource 来替换前两个阶段,但我发现这种方法不够用,因为 1)自定义源的文档严重缺乏 2)需要更多的时间和代码来实现 3)这种一对多问题很可能在管道中间遇到,我无法创建自定义源。

我应该如何处理 Dataflow 管道中的一对多阶段?

标签: javaperformanceone-to-manygoogle-cloud-dataflowapache-beam

解决方案


推荐阅读