2016-09-22 197 views
2

我正在處理數據流的apache flink,我有幾個問題。任何幫助是極大的讚賞。謝謝。Flink窗口和狀態維護

1)創建翻滾窗口是否有任何限制。例如,如果我想爲每個用戶ID創建一個滾動窗口2秒,並且假設我有超過1000萬個用戶ID,那會是一個問題。 (我使用keyBy用戶ID,然後創建timeWindow 2秒)?這些窗口如何在flink內部維護?

2)我看着重新平衡循環分區。假設我設置了一個集羣,並且如果我的源並行度爲1,並且如果我進行了重新平衡,我的數據是否會跨機器混洗以提高性能?如果是這樣,是否有一個特定端口用於將數據傳輸到集羣中的其他節點?

3)狀態維護有沒有限制?我打算保留一些用戶ID相關的數據,這些數據可能會變得非常大。我讀了關於flink使用rocks db來維護狀態。只是想檢查一下可以維護多少數據是否有任何限制?

4)還有,如果數據量較少,狀態是否維持? (我猜在JVM內存中)如果我的集羣上有幾臺機器,每個節點都可以獲得當前的狀態版本?

回答

2
  1. 如果keyBy您的user流,弗林克將在內部用戶劃分流。因此,用戶分佈在一組平行的子任務中。窗口操作符的並行性控制每個並行子任務的負載。如果分配足夠的機器並適當配置程序的並行性,處理1000萬用戶應該沒有問題。

  2. 是的,如果您的作業在多臺機器上運行,則rebalance()將在網絡上隨機播放。使用默認配置時,數據端口將自動選擇。如果你需要一個固定的端口,你可以使用taskmanager.data.portconfigure它。

  3. 狀態大小限制取決於配置的state backend。在RocksDB狀態後端中,限制是本地文件系統的大小,即RocksDB將數據泄漏到磁盤。如果您達到此限制,則可以增加並行度,因爲每個工作人員通常會處理多個密鑰的密鑰。

  4. 它取決於狀態持續狀態(磁盤或內存)的狀態後端的實現。我會假設寫入磁盤的RocksDB狀態後端在內存中緩存一些數據。請注意,運算符狀態不是全局可訪問的,即運算符的每個並行子任務只能訪問其本地狀態,並且不能讀取或寫入同一運算符的另一個子任務的狀態。

+0

非常感謝您的回答。我只是有一些後續問題。 – Neoster

+0

如果運算符狀態不是全局的,那麼可以說,如果我想維護一個子任務本地的以前的計算狀態,那麼有沒有辦法確保下一個數據進入同一個用戶id進入同一個子任務?如果沒有,那麼你是否應該使用集中式緩存來實現這一目標,而不是維護flink中的狀態? – Neoster

+0

另外我試圖找到一種方法將外部配置更改發送到flink。例如,對於每個計算,都有很少的參數需要考慮。比方說,一個新的參數被添加,必須考慮新的計算,那麼有沒有辦法將這個改變發送到flink並且具有集中配置狀態? – Neoster