【问题标题】:Constructing Dataflow pipeline with same transforms on side outputs在侧输出上构建具有相同转换的数据流管道
【发布时间】:2017-02-06 14:55:09
【问题描述】:

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

构建管道至少有三个选项。 (下面是伪代码)

  1. 使用转换的新实例处理每个侧输出。

    sideOutput1.apply(new HandleErrorTransform());
    sideOutput2.apply(new HandleErrorTransform());
    
  2. 使用转换的单个实例处理每个侧输出。

    Transform errorTransform = new HandleErrorTransform();
    sideOutput1.apply(errorTransform);
    sideOutput2.apply(errorTransofrm);
    
  3. 将这些侧输出的输出展平,并使用单个转换来处理所有错误。

    PCollectionList.of(sideOutput1).and(sideOutput2)
      .apply(Flatten.<ErrorMessage>pCollections())
      .apply(new HandleErrorTransform());
    

对于使用哪一种以获得更好的可扩展性和性能,是否有任何建议?或者也许没关系?

【问题讨论】:

    标签: google-cloud-dataflow apache-beam


    【解决方案1】:

    1 和 2 基本相同——因为管道是序列化的,所以共享没有任何优势。

    选项 3 可能具有一些优势,因为您可以更轻松地向该路径添加更多逻辑。扩展可能会更容易一些,因为只有一个源将元素写入最终位置,这意味着更少的缓冲区、更多批处理元素的机会等。

    3 的一个缺点是使用 flatten 会阻止在 HandleErrorTransform 中创建的任何窗口,直到所有主管道都处理了这些时间戳。这可能是可取的 - 此窗口中记录的所有错误 - 但如果不是可以使用触发器解决。

    【讨论】:

    • 感谢您的提示,本。我们没有在转换中创建任何用于错误处理的窗口。但是错误消息可能是从具有不同窗口的步骤中发出的。一些较早的步骤在全局窗口范围内,而后面的步骤在基于处理时间的窗口上的 GroupByKey 后面。好奇将输入与不同窗口合并时的效果。但这可能值得拥有自己的主题。
    • 我相信Flatten 将要求所有输入具有相同的窗口。在这种情况下,您可能需要在展平之前对每个 sideOutput 执行 3 个变体。如果HandleErrorTransform 包含GroupByKey 或其他聚合,您可能还需要插入一个定期触发的触发器,因为GlobalWindow 将永远不会发出数据。
    猜你喜欢
    • 2021-06-25
    • 2021-02-04
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2012-07-24
    相关资源
    最近更新 更多