数据流:是否可以异步运行部分管道和其他部分异步运行?

时间:2016-12-21 17:47:31

标签: google-cloud-dataflow

我正在设置简单的Dataflow管道,如下所示:

Pipeline p = Pipeline.create(options);
p.apply(TextIO.Read.from("source.csv"))
.apply(ParDo.of(new TransformEachLine()))
.apply(ParDo.of(new ProcessEachTransform()));
p.run();

如果TransformEachLine的每次迭代完成由相应的ProcessEachTransform迭代生成的所有元素,我怎样才能使TransformEachLine的每次迭代等待?另外,如何使TransformEachLine的每次迭代按顺序执行(如源" .csv"文件中所示)

基本上,对我来说,重要的是水平缩放并随机化ProcessEachTransform,而不是同时随机化两个ParDo

目前,此管道的假设输出看起来像这样:

Line B
   Processed item 2
   Processed item 1
   Processed item 3
Line A
   Processed Item 3
   Processed Item 1
   Processed Item 2
Line C
   Processed Item 1
   Processed Item 3
   Processed Item 2

我如何调整" XX行"顺序,但保持"处理项目XX"在每个"第XX行"中随机化和并列化这是否意味着我必须在本地执行部分代码并将其他部分发送到Dataflow以进行并行处理?

1 个答案:

答案 0 :(得分:0)

听起来你实际上需要按照输入文件中指定的顺序处理事物。

这不是你可以直接在Beam API中表达的东西:PCollection元素的处理总是并行和无序的 - 你需要按顺序运行每个事务作为一个管道(尽管事务的数量是低 - 最多只有几百个 - 你可以在管道本身的结构中表达顺序,例如每个事务1个转换和一些连接使变换按顺序执行 - 让我知道你是否想知道这个我会编辑我的答案。)

请注意,Beam模型也不保证要处理一个元素多少次(例如,跑步者可以在重试失败或冗余时多次处理一个元素) ,所以你需要在一个交易中处理物品也是幂等的。