2015-12-01 26 views
1

我有4種類型的kafka主題和每種類型的65個主題。目標是對數據做一些簡單的窗口聚合並將其寫入數據庫。Flink - 構建作業以最大化吞吐量

的拓撲結構將類似於:

卡夫卡 - >窗口 - >減少 - > DB寫入

某處在這個組合我想/需要做工會 - 或者可能的幾個(取決於每次組合多少個主題)。

主題中的數據流量範圍從10K到> 200K messages/min。

我有一個四節點的30個核心/節點的flink羣集。我如何構建這些拓撲來傳播負載?

+0

快速提問,確保避免混淆:您是否總共有260個Kafka主題,每個主題有多個分區,或者每個分區有4個Kafka主題?在後一種情況下,傳播會自然發生。 –

+0

260個主題,每個主題有一個分區。 – ethrbunny

回答

3

我正在寫這個答案,假設每個相同類型的65個主題包含相同類型的數據。

解決此問題的最簡單方法是更改​​Kafka設置,使您有4個主題,每個主題有65個分區。然後,程序中有4個數據源,具有高並行性(65),並自然分佈在整個羣集中。

如果這是不可能改變的設置,我看到兩件事情可以做:

  • 一個可能的解決方案是創建FlinkKafkaConsumer的修改版本,其中一個源可以消耗多個主題(而而不僅僅是一個主題的多個分區)。隨着這一變化,它就會像你使用多個分區一樣工作,而不是許多主題。如果你想使用這個解決方案,我會ping通郵件列表來獲得一些支持。無論如何,這將是Flink代碼的有價值補充。

  • 您可以爲每個來源指定一個單獨的資源組,這會給它一個專用的插槽。你可以通過「env.addSource(new FlinkKafkaConsumer(...))。startNewResourceGroup();」來實現。但在這裏,觀察到的是,您嘗試在具有120個內核的羣集上執行260個不同的源(因此可能有120個任務插槽)。您需要增加插槽的數量以容納所有任務。

我認爲第一個選項是更好的選擇。

+0

因此,如果我按照原樣進行操作,它會嘗試將它們全部放在同一臺機器上?不改變分區不是一種選擇。 – ethrbunny

+0

除非您指定「startNewResourceGroup()」,否則調度將嘗試重用現有資源組,這可能會導致它們共享同一臺計算機。在我看來,多主題Kafka消費者是最好的選擇。 –

+1

我將通過一個FlinkKafkaConsumer https://issues.apache.org/jira/browse/FLINK-3102添加對多個主題的閱讀支持 –