2017-02-27 54 views
1

我正在嘗試評估Apache Flink是否正在使用自定義代碼在生產中運行的用例。自定義窗口上的閃爍觸發

所以我們假設有一個事件流,每個事件都包含一個不斷增加的整數的特定屬性X。這是一堆連續的事件將此屬性設置爲N,然後下一批將其設置爲N + 1等。 我想將流分成具有相同值X的事件窗口,然後執行一些操作分別進行計算。

所以我定義了一個GlobalWindow和一個自定義觸發其中onElement方法我覈對當前X的值保存任何給定元素的屬性(從狀態變量),如果它們不同我得出結論,我們已經積累了X = CURRENT的所有事件,現在是時候進行計算並增加狀態中的X值。

這種方法的問題是來自下一個邏輯批次(X = CURRENT + 1)的元素已被使用,但它不是前一批次的一部分。 有沒有辦法將它以某種方式放回到流中,以便正確說明下一批?

或者,也許我的方法是完全錯誤的,還有更簡單的方法來實現我所需要的?

謝謝。

回答

1

我認爲你是在正確的軌道上。

Trigger指定何時可以處理窗口併發出窗口結果。

WindowAssigner是說哪個窗口元素將被分配的部分。所以,我要說,你還需要提供WindowAssigner自定義實現,將同一個窗口分配給所有元素與十

1

更慣用的方式來做到這一點與弗林克是使用stream.keyBy(X).window(...)的同等價值。 keyBy(X)按X的特定值處理分組元素。然後,您可以應用任何類型的窗口。在你的情況下,SessionWindow可能是一個不錯的選擇。在該鍵在某個可配置的時間段內沒有被看到之後,它將爲每個鍵啓動。

這種方法對於您必須始終假設在流處理系統中的無序數據要更加健壯。

+0

謝謝傑米。在我的情況下,問題是在X的不同值之間沒有明確的差距。這是我知道我已經得到X = N的所有值的唯一方式是,當我看到X = N + 1時,如此差距可能是幾天甚至幾周。 – Joe