为什么我的融合断路器会丢失或阻止数据?

时间:2017-02-24 20:54:16

标签: google-cloud-dataflow apache-beam

我正在开发一个流式数据流管道,它从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分钟后数据从变换中消失后,屏幕截图是在作业耗尽后拍摄的。

enter image description here

*有人可以想到解释吗?感觉好像融合破坏者正在退缩或丢失了一些物品。 *

我注意到它只发生在数据量/数据速率很高时,迫使管道在测试运行过程中扩大规模,从25个增加到50个n1-highmem-2工作者。但是,我还没有做足够的测试来验证扩展是否是重现此问题的关键。

或许触发器每两秒钟就会频繁发射一次?

我正在使用Dataflow 2.0.0-beta1。工作ID是“2017-02-23_23_15_34-14025424484787508627”。

1 个答案:

答案 0 :(得分:1)

Streaming Dataflow中的计数器是尽力而为的措施;特别是自动缩放可能会导致更大的差异。在这种情况下,管道不应丢失数据。