2016-09-15 39 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

相關問題