在侧输出上构建具有相同转换的数据流管道
Constructing Dataflow pipeline with same transforms on side outputs
我们正在构建一个流式管道,其中数据可能会在几个步骤中遇到不同的错误,例如序列化错误、验证错误和写入存储时的运行时错误。每当错误发生时,我们都会将数据定向到侧面输出。这些侧输出的错误处理逻辑是相同的。我们将数据写入公共错误存储以供 post 处理/报告。
至少有三种构建管道的选项。 (以下伪代码)
使用新的转换实例处理每一侧输出。
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());
对于使用哪一个以获得更好的可伸缩性和性能,是否有任何建议?或者也许这无关紧要?
1 和 2 基本相同——因为管道是序列化的,所以共享没有任何优势。
选项 3 可能有一些优势,因为您可以更轻松地向该路径添加更多逻辑。扩展可能会更容易一些,因为只有一个源将元素写入最终位置,这意味着缓冲区更少,批处理元素的机会更多,等等。
3 的一个缺点是使用 flatten 将阻止在 HandleErrorTransform
中创建的任何 windows,直到所有主管道都处理了这些时间戳。这可能是可取的——来自此 window 中记录的所有错误——但如果没有,可以使用触发器解决。
我们正在构建一个流式管道,其中数据可能会在几个步骤中遇到不同的错误,例如序列化错误、验证错误和写入存储时的运行时错误。每当错误发生时,我们都会将数据定向到侧面输出。这些侧输出的错误处理逻辑是相同的。我们将数据写入公共错误存储以供 post 处理/报告。
至少有三种构建管道的选项。 (以下伪代码)
使用新的转换实例处理每一侧输出。
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());
对于使用哪一个以获得更好的可伸缩性和性能,是否有任何建议?或者也许这无关紧要?
1 和 2 基本相同——因为管道是序列化的,所以共享没有任何优势。
选项 3 可能有一些优势,因为您可以更轻松地向该路径添加更多逻辑。扩展可能会更容易一些,因为只有一个源将元素写入最终位置,这意味着缓冲区更少,批处理元素的机会更多,等等。
3 的一个缺点是使用 flatten 将阻止在 HandleErrorTransform
中创建的任何 windows,直到所有主管道都处理了这些时间戳。这可能是可取的——来自此 window 中记录的所有错误——但如果没有,可以使用触发器解决。