Google cloud dataflow 在侧面输出上使用相同的转换构造数据流管道

Google cloud dataflow 在侧面输出上使用相同的转换构造数据流管道,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我们正在构建一个流式管道,其中数据在几个步骤中可能会遇到不同的错误,例如序列化错误、验证错误和写入存储时的运行时错误。每当错误发生时,我们将数据定向到一个侧面输出。这些侧输出上的错误处理逻辑相同。我们将数据写入一个常见错误存储器,以便进行后期处理/报告 至少有三种方案可以构建pipleine。(下面是伪代码) 使用变换的新实例处理每侧输出 sideOutput1.apply(new HandleErrorTransform()); sideOutput2.apply(new HandleErro

我们正在构建一个流式管道,其中数据在几个步骤中可能会遇到不同的错误,例如序列化错误、验证错误和写入存储时的运行时错误。每当错误发生时,我们将数据定向到一个侧面输出。这些侧输出上的错误处理逻辑相同。我们将数据写入一个常见错误存储器,以便进行后期处理/报告

至少有三种方案可以构建pipleine。(下面是伪代码)

  • 使用变换的新实例处理每侧输出

    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
    将不会发出数据。