在侧输出上构建具有相同转换的数据流管道

Constructing Dataflow pipeline with same transforms on side outputs

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

至少有三种构建管道的选项。 (以下伪代码)

  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());
    

对于使用哪一个以获得更好的可伸缩性和性能,是否有任何建议?或者也许这无关紧要?

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

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

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