我正在开发一个流式数据流管道,它从PubSub使用批处理项目的消息,并最终将它们写入数据存储区。为了更好的并行性,以及及时确认从PubSub中提取的消息,我将批次打包成单个项目并在其后添加一个融合断路器。
所以管道看起来像这样......
PubSubIO - >反序列化 - > unpack - >融合中断 - >验证/转换 - > DatastoreIO。
这是我的融合破坏者,主要是从the JdbcIO class复制而来。它使用触发器来分解全局窗口中的数据。
public class BreakFusionTransform<T> extends PTransform<PCollection<T>, PCollection<T>> {
@Override
public PCollection<T> expand(PCollection<T> input) {
return input
.apply(ParDo.of(new RandomKeyFn<T>()))
.apply(Window.<KV<Integer, T>>triggering(
Repeatedly.forever(
AfterProcessingTime
.pastFirstElementInPane()
.plusDelayOf(Duration.standardSeconds(2L))))
.discardingFiredPanes())
.apply(GroupByKey.<Integer, T>create())
.apply(Values.<Iterable<T>>create())
.apply(Flatten.<T>iterables());
}
private static class RandomKeyFn<T> extends DoFn<T, KV<Integer, T>> {
private Random random;
@Setup
public void setup() {
random = new Random();
}
@ProcessElement
public void processElement(ProcessContext context) {
context.output(KV.of(random.nextInt(), context.element()));
}
}
}
它在大多数时间都有效,除非在输出数量少于输入数量的情况下,即使在完成流输入并且管道空闲十分钟之后也是如此。
如下面的Dataflow作业监视控制台中所示。在我等待大约10分钟后数据从变换中消失后,屏幕截图是在作业耗尽后拍摄的。
*有人可以想到解释吗?感觉好像融合破坏者正在退缩或丢失了一些物品。 *
我注意到它只发生在数据量/数据速率很高时,迫使管道在测试运行过程中扩大规模,从25个增加到50个n1-highmem-2工作者。但是,我还没有做足够的测试来验证扩展是否是重现此问题的关键。
或许触发器每两秒钟就会频繁发射一次?
我正在使用Dataflow 2.0.0-beta1。工作ID是“2017-02-23_23_15_34-14025424484787508627”。
答案 0 :(得分:1)
Streaming Dataflow中的计数器是尽力而为的措施;特别是自动缩放可能会导致更大的差异。在这种情况下,管道不应丢失数据。