Google cloud dataflow 在侧面输出上使用相同的转换构造数据流管道
我们正在构建一个流式管道,其中数据在几个步骤中可能会遇到不同的错误,例如序列化错误、验证错误和写入存储时的运行时错误。每当错误发生时,我们将数据定向到一个侧面输出。这些侧输出上的错误处理逻辑相同。我们将数据写入一个常见错误存储器,以便进行后期处理/报告 至少有三种方案可以构建pipleine。(下面是伪代码)Google cloud dataflow 在侧面输出上使用相同的转换构造数据流管道,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我们正在构建一个流式管道,其中数据在几个步骤中可能会遇到不同的错误,例如序列化错误、验证错误和写入存储时的运行时错误。每当错误发生时,我们将数据定向到一个侧面输出。这些侧输出上的错误处理逻辑相同。我们将数据写入一个常见错误存储器,以便进行后期处理/报告 至少有三种方案可以构建pipleine。(下面是伪代码) 使用变换的新实例处理每侧输出 sideOutput1.apply(new HandleErrorTransform()); sideOutput2.apply(new HandleErro
sideOutput1.apply(new HandleErrorTransform());
sideOutput2.apply(new HandleErrorTransform());
Transform errorTransform = new HandleErrorTransform();
sideOutput1.apply(errorTransform);
sideOutput2.apply(errorTransofrm);
PCollectionList.of(sideOutput1).and(sideOutput2)
.apply(Flatten.<ErrorMessage>pCollections())
.apply(new HandleErrorTransform());
PCollectionList.of(sideOutput1).和(sideOutput2)
.apply(展平.pCollections())
.apply(新的HandleErrorTransform());
有没有关于使用哪一个的建议,以获得更好的可伸缩性和性能?或者可能没关系?1和2基本上是一样的——因为管道是序列化的,所以共享没有任何好处 选项3可能有一些优势,因为它更容易为该路径添加更多逻辑。它可能更容易扩展,因为只有一个源将元素写入最终位置,这意味着更少的缓冲区,更多的批处理元素的机会,等等
3的一个缺点是,在所有主管道处理完这些时间戳之前,使用flatte将保留在
HandleErrorTransform
中创建的所有窗口。这可能是可取的——此窗口中记录的所有错误——但如果不是,可以使用触发器解决。感谢您的提示,Ben。我们不会在转换中创建任何用于错误处理的窗口。但是错误消息可能是从具有不同窗口的步骤发出的。前面的一些步骤位于全局窗口范围内,而后面的步骤位于基于处理时间的窗口上的GroupByKey之后。好奇的是,当将输入与不同的窗口合并时会产生什么效果。但这可能有其独特的主题。我相信flant
将要求所有输入具有相同的窗口。在这种情况下,您可能需要在展平之前对每个侧输出应用3个全局窗口。如果HandleErrorTransform
包含GroupByKey
或其他聚合,您可能还需要插入定期触发的触发器,因为GlobalWindow
将不会发出数据。