窗口会话完成后,是否会触发数据流触发器?

时间:2018-08-28 08:07:18

标签: google-cloud-dataflow apache-beam google-cloud-pubsub

我使用Google Cloud PubSub和Dataflow处理我的数据。我想检测我的日常工作何时完成,换句话说,何时完成窗口会话/达到间隔时间。在这种情况下是否可以触发一个触发器?如果没有,我可以使用一种解决方法吗?

    Pipeline p = Pipeline.create(options);
    p.apply("ReadPubSubMessage", PubsubIO.readMessages().fromSubscription("projects/project-id/subscriptions/my-sub"))
            .apply("ApplyTimestamps", WithTimestamps.of((PubsubMessage pubSub) -> new Instant(System.currentTimeMillis())))
            .apply("SessionWindowing", Window.<PubsubMessage>into(Sessions.withGapDuration(Duration.standardMinutes(10)))
                    .triggering(?)
                    .withAllowedLateness(Duration.standardSeconds(30))
                    .discardingFiredPanes())
                    .apply(new CountWords())

对不起,如果我错过了文档中明显的内容。

2 个答案:

答案 0 :(得分:0)

如果我正确理解了您的情况,则达到间隔持续时间(根据sessions definition)时,窗口将结束。因此,您可以使用Default Trigger,因为您已绑定了窗口,所以它将仅触发一次。那有意义吗?

在这里您可以找到DefaultTrigger official documentation

答案 1 :(得分:0)

是的,您可以使用DefaultTrigger.of()触发器,我在下面放了一个示例代码。 请注意,它不能在DirectRunner中使用,但可以在Google Dataflow中使用。

PCollection<KV<String, FormMessageMeta>> formMetaSessionWindowCollection = formMessageMetaKvCollection.apply(
            "Session-Window",
            Window.<KV<String, FormMessageMeta>>into(
                    Sessions.withGapDuration(Duration.standardMinutes(40)))
            .triggering(DefaultTrigger.of()) 
            .withAllowedLateness(Duration.ZERO).accumulatingFiredPanes());

会话窗口只能在KV上应用。