【发布时间】:2016-12-21 17:47:31
【问题描述】:
我正在设置如下所示的简单数据流管道:
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 对我来说很重要,但不是同时随机化前两个 ParDos。
现在,该管道的假设输出如下所示:
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 进行并行处理?
【问题讨论】:
-
您能否详细介绍一下您的用例:有多少“行”以及每行有多少项?为什么需要按顺序处理它们?您处理它们的顺序是否重要(与 .csv 文件中的顺序相同?),还是只有两条线不会同时得到处理?
-
因为这些是金融交易。假设 (1) A 支付 B,然后 (2) B 支付 C(历史数据,以批处理方式处理)。如果 (2) 在 (1) 之前处理,您可能没有足够的资金,即使在现实生活中由于 (1) 而不是这种情况。因此,按顺序执行 (1) 和 (2) 很重要。同时,假设每笔交易涉及一百万次(或数次)操作。结果是处理(1)和(2)会很好,但是将每个子操作分布在一定数量的工作节点之间,因此它们被快速处理。