2016-03-21 63 views
1

我已經實現了打開固定UDP端口並偵聽它的源代碼。所以,我想每個任務管理器只運行一個源代碼(在我的情況下,我爲每個節點運行一個任務管理器),因爲會拋出異常的java.net.BindException: Address already in use異常。如何爲每個任務管理器(或每個節點)運行一個源?

當測試Apache Flink的HA時,我注意到了這個問題。當我關閉一個任務管理器時,Apache Flick開始嘗試在一個節點上運行具有相同端口的兩個源。

那麼,如何每個任務管理器(或每個集羣節點)只運行一個源?

+0

您是否嘗試將並行性設置爲您擁有的節點數量? – Chobeat

+0

如何動態地執行它(基於數字任務管理器或節點)? –

+0

來自doc:「通過調用ExecutionEnvironment中的setParallelism(int parallelism)或通過將-p 傳遞給Flink命令行前端,可以覆蓋整個作業的默認並行性。通過調用setParallelism可以覆蓋它的單個轉換(int parallelism),有關並行性的更多信息,請參閱編程指南。「 – Chobeat

回答

1

目前不可能動態強制每個TaskManager上只運行一種任務。您可以通過將插槽數設置爲1來避免將多個源任務安排到同一臺計算機上。但是,如果您丟失一臺機器並且沒有備用TaskManager,那麼您將沒有足夠的插槽重新開始工作。

或者,您可以編寫自己的源代碼,使其更具彈性。例如,如果不能綁定到指定的端口,則可以簡單地停止源。鑑於沒有其他程序可以綁定到端口,那麼您知道已經有另一個源任務使用該端口的數據。

+0

我在第一個解決方案中看到問題:可以在任何任務管理器/節點上啓動源,但是我只能將數據發送到羣集的一個節點(活動/主節點)。所以,第二種解決方案更有趣,但我有一個問題: 1)請你解釋一下「停止來源」是什麼意思?如何停止源代碼? 2)據我瞭解,AF將嘗試重新啓動採樣源。對?所以,在這種情況下,AF會立即重啓流程。對? –

+1

只需離開「運行」功能即可。這將完成任務。所以你可以嘗試打開一個套接字,如果失敗了,那麼你離開'run'方法。 –

+0

我測試過了。似乎一切正常。謝謝。 –

相關問題