2016-07-14 87 views
1

目前我們有一個數據流程,其中我們有一個GroupByKey,但DoPar在group-by之後每個鍵得到太多的值,我們想知道是否有這個好的解決方案。從我可以告訴的是,沒有辦法設置每個窗口的最大數值。限制每個鍵值的數量

現在我們正在探索3個選項:

  1. 較小的窗口 - 我們認爲我們可能仍然有這個問題,因爲該事件可能出現在時間聚集在一起。
  2. 在每個鍵上添加一個隨機值來分割鍵 - 這也不是理想的,因爲當我們有更少的事件進入時,每個鍵的值都會太少。當事件數量呈指數增長時,我們也無法調整分區數量。
  3. 一些花哨的觸發或使用組合器 - 可能是最好的解決方案,但不知道如何做到這一點。

有沒有一個標準的方法或最佳做法呢?

回答

2

您提到的每個選項都是可能的,儘管這是理想選擇,部分取決於您之後計算的內容以及您是在有界數據上運行批處理管道還是在無界數據上運行流管道。

  1. 您可以創建一個自定義WindowFn,限制每個窗口中元素的數量。例如,您可以將每個元素分配給一個窗口,如(1, [startTime, endTime))。然後你將多個窗口合併在一起,添加他們的計數。一旦計數太高,你就停止合併。

  2. 隨機細分鍵是確保分區並允許代碼更好地跨機器分佈的好方法。

  3. 您可以使用諸如「AfterPane.elementCountAtLeast(500)」之類的觸發器來輸出〜500個元素的窗格。如果唯一的問題是可迭代到DoFn的大小,這應該有所幫助。這也會產生更多/更早的輸出,這可能會也可能不需要。

  4. 如果ParDo的計算是聯想和交換,寫一個CombineFn將產生到存儲更少的數據,並會提高批處理和流媒體整體管道性能。

如果您可以描述您的具體可能會指導您採用這些解決方案之一。否則,我們建議儘可能從CombineFn開始,然後看看在此之後是否需要追求其他路徑。