首页 > 解决方案 > Google Cloud Dataflow 窗口化数据和分组

问题描述

我有一个管道,它从 PubSub 获取事件流,应用 1h 窗口,然后将它们写入 Google Cloud Storage 上的文件。最近我意识到有时在 1 小时的窗口中会出现太多事件,所以我还添加了一个触发器,如果​​窗格中的事件超过 100k 个则触发。现在的问题是,仅当窗口内的单个组超过该数量时才会触发 100k 限制,而不是整个管道。

管道的相关部分如下所示:

PCollection<String> rawEvents = pipeline
   .apply("Read PubSub Events",
       PubsubIO.readStrings()
               .fromSubscription(options.getInputSubscription()));

rawEvents
   .apply("1h Window",
       Window.<String>into(FixedWindows.of(Duration.standardHours(1))
          .triggering(
              Repeatedly
                 .forever(
                    AfterFirst.of(
                       AfterPane.elementCountAtLeast(100000),
                       AfterWatermark.pastEndOfWindow())))
                 .discardingFiredPanes()
                 .withAllowedLateness(Duration.standardDays(7), 
              Window.ClosingBehavior.FIRE_IF_NON_EMPTY)
          .withOnTimeBehavior(Window.OnTimeBehavior.FIRE_IF_NON_EMPTY))
   .apply("Write File(s)", new WriteFiles(options, new EventPartitioner()));

WriteFiles组件是一个PTransform扩展的组件FileIO.Write,它通过一个键对元素进行分组。

我将如何做到这一点,以便在管道中总共有 100k 事件而不是特定组的 100k 事件之后触发窗口?提前致谢!

标签: google-cloud-dataflowapache-beamdataflowapache-beam-io

解决方案


推荐阅读