2016-09-15 57 views
1

我是Dataflow的新手,所以这可能是一个简单的问题。GroupByKey在Google Cloud Dataflow中没有返回任何元素

我想尝试Sessions窗口策略。根据窗口文档,窗口不会应用,直到我们完成了GroupByKey,所以我试图做到这一点。但是,当我在Google Cloud Platform中查看自己的管道时,可以看到MapElements返回了元素,但没有元素由GroupByKey(“元素添加: - ”)返回。按键分组时,我做错了什么?

下面的代码的最相关的部分:根据触发策略,这决定

events = events 
    .apply(Window.named("eventsSessionsWindowing") 
    .<MyEvent>into(Sessions.withGapDuration(Duration.standardSeconds(3))) 
); 

PCollection<KV<String, MyEvent>> eventsKV = events 
    .apply(MapElements 
    .via((MyEvent e) -> KV.of(ExtractKey(e), e)) 
    .withOutputType(new TypeDescriptor<KV<String, MyEvent>>() {})); 

PCollection<KV<String, Iterable<MyEvent>>> eventsGrouped = eventsKV.apply(GroupByKey.<String, MyEvent>create()); 
+0

有几个问题可以帮助调试。这是批处理还是流式管道?你使用的是什么跑步者(直接,数据流,火花,闪光,......)这个问题是否在直接跑步者身上复制?除了“添加元素”消息外,您是否还有其他证据表明GBK中没有元素 - 例如如果添加另一个将分组KV写入TextIO的ParDo,它是否以空输出结束? – jkff

+0

这是一个流式管道(我们从pubsub读取),使用DataflowPipelineRunner。还没有尝试与直接亚军呢。我试图在GroupByKey之后的ParDo中输出调试信息,但没有输出。我正在使用LOG.info(...)(我知道有效)进行调试。 虽然在GroupByKey中没有添加任何元素,但它有时会在Google Cloud的GroupByKey框中显示“1个元素/ s”。 –

+0

我现在发现GroupByKey实际上工作 - 它只是非常慢。我必须等待几分钟才能显示日志输出。 GroupByKeys应该花费那么长时间,还是更可能是我做了一些愚蠢的事情。目前,我们没有给Dataflow大量的数据。 –

回答

0

一个GroupByKey火灾时,系统认为该按键/窗口中的所有数据已经​​收到,现在是时候将其分组并传递给下游转换。默认的策略是:

默认的触发为PCollection是事件时间为主,并在系统的水印(当它“应该”拥有所有数据的数据流的概念)经过发射窗口的结果窗口的结尾。

详情请参阅Default Trigger。您看到了几分钟的延迟,这与PubSub的水印进展相对应。

+0

PubSub的水印或Dataflow的水印? –

+0

数据流对PubSub水印的估计。 PubSub本身不提供水印功能,因此Dataflow在内部计算估算值。 – jkff

相关问题