2017-02-13 21 views
0

我們正在運行處理多個輸入流的Dataflow作業。其中一些是高流量,其中一些很少收到消息。我們使用包含與所有元素相關的信息的「共享」流來加入所有流。這是管道的一個簡單的例子:Dataflow流水線在執行GroupBy之前等待來自所有流的元素

Pipeline Example

我注意到,工作不會產生任何輸出,直到流包含一定的流量。

例如,假設Stream 1獲得穩定的流量,而Stream 2在一段時間內不會產生任何消息。此時,作業的DAG將顯示GroupByKey步驟中正在積累的元素,但是除此之外沒有任何內容會傳播。我還可以看到Flatten PCollections步驟顯示圖表左側的輸入元素,但不是正確的。當處理同一作業中的高流量流量低流量流時,這會產生問題,因爲這將導致輸出延遲達到Stream 2拾取消息所需的量。

我不確定觀察結果是否正確,但我想問一下,這是一般的Flatten/GroupByKey如何工作,如果是這樣,如果我們看到的問題可以通過構建管道。

(實施例作業ID:2017-02-10_06_48_01-14191266875301315728)

+0

你在那一步使用了什麼樣的窗口和觸發器?即使沒有流中的元素,您也應該能夠配置您的窗口/觸發器來工作。 – Pablo

+0

@Pablo'FixedWindows'和'Sessions'具有默認觸發器和第二種情況下30分鐘的間隔持續時間。 據我所知,我可以添加一個觸發器,使用處理時間或過早添加的元素數量,但我想避免這種情況,因爲這意味着某些會話將不完整(30分鐘不活動可能沒有通過)當面板被觸發時。 – livathinos

回答

1

作爲group-by-key文檔的默認行爲是在窗口內等待所有數據已經​​到達描述 - 這是必要的,以確保正確性的下游結果。

根據您正在嘗試執行的操作,您可能可以使用triggers來使得聚合輸出更早。

您也可以使用慢速流作爲side-input來處理快速流。

如果你仍然陷入困境,如果你能夠更詳細地描述流的內容以及你如何使用它們,這將有所幫助,因爲更詳細的答案取決於目標。

+0

這是否意味着如果其中一個流沒有產生任何數量的元素,那麼'GroupByKey'將等待,直到每個流至少有一個元素才能知道它需要關閉'Session'?確切的用例是我試圖實現一個用戶會話,在這裏我跟蹤了大量消息類型(點擊,頁面瀏覽等)的用戶活動。某些會話可能包含所有流的元素(例如,用戶點擊了某個內容並查看了一個頁面),但有些可能不會。 – livathinos

+0

這項工作目前正在消耗20個不同的流,其中一部分流程有資格被認爲是「緩慢」或根本不傳播元素。我認爲使用側面輸入可能不是要走的路,因爲它可能是任何一個流傳輸失敗或緩慢的流。 我也在考慮錯誤配置的情況:假設由於某種原因,我的一個訂閱由於配置錯誤而無法發送消息,或者消息可能不會再傳播給它。這是否意味着管道會無限期地保持會話窗口? – livathinos

+0

實際行爲取決於上游來源如何跟蹤水印。例如,如果沒有數據到達,PubSub源將允許水印前進到當前時間。但是,CoGroupByKey步驟需要等到所有上游源的水印已經超過固定窗口的末端等等 –