2015-11-22 154 views
2

我設置了一個3節點的羣集,可以非常均勻地分配任務(步驟?作業?),直到最近一次分配給一臺機器。flink - 羣集未使用羣集

拓撲(我們仍然使用這個術語以弗林克):

kafka (3 topics on different feeds) -> flatmap -> union -> map

enter image description here

有什麼關於這一步,將告訴集羣管理器把一切都在一臺機器?

此外 - 圖像中的「未設置」值是什麼?我錯過了一些步驟?或者一些即將實施的UI功能?

回答

2

的問題是,你正在構建上無鎖(羣組)流global window,所以窗口有一臺機器上運行。

也許你也可以表達不同的應用程序邏輯,這樣你可以把這些流。

的「(未設置)」的一部分可能是弗林克的DataStream API,它不設置默認的操作符名字的問題。 喬布斯對DataSet API實現的將是這樣的: enter image description here

+0

我回去看看有問題的代碼,它是'鍵'。還有其他一些原因,爲什麼它不會在整個集羣中傳播? – ethrbunny

+0

哦,對不起。我的回答不太準確。您在Web界面中看到的內容只是該計劃的邏輯表示。它並不代表操作員在羣集上如何運行分佈。因此,即使只有一個窗口框,它並不意味着它只能在一臺機器上執行。 在下面的列表中,您可以看到不同的運算符。當你點擊快速翻滾窗口時,你可以看到運行窗口的並行實例。 –

+0

當我點擊UI下部的一個框時,它會打開以顯示所有並行實例。每個報告都在同一臺機器上。 – ethrbunny

3

它實際上是有目的在於弗林克安排在單任務管理你的工作。爲了理解它,讓我快速解釋Flink的資源調度算法。

首先,在世界弗林克的槽可以容納一個以上的任務(操作者的並行實例)。實際上,它可以容納每個運營商的一個並行實例。原因在於Flink不僅以流媒體方式執行流式作業,而且還執行批處理作業。 流媒體時尚我的意思是說,Flink會讓您的數據流圖形的所有運營商聯機,以便中間結果可以直接傳輸到消費它們的下游運營商。默認情況下,Flink會嘗試在一個插槽中合併每個運營商的一項任務。

當弗林克調度的任務的不同時隙,那麼它會嘗試共同定位與它們的輸入的任務,以避免不必要的網絡通信。對於來源,共同定位取決於實施。例如,對於基於文件的源,Flink會嘗試將本地文件輸入拆分分配給不同的任務。

因此,如果我們將此應用於您的工作,那麼我們會看到以下內容。並行性1有三種不同的來源。所有來源屬於同一個資源共享組,因此每個運營商的單個任務將部署到同一個插槽。最初的插槽是從可用的實例中隨機選擇的(實際上它取決於在JobManager處註冊的TaskManager的順序),然​​後填滿。假設所選的插槽在機器node1上。

接下來我們具有再次的各平坦映射運算符的兩個子任務之一可以被部署到已經容納三個來源相同時隙的2。這裏的平行的三個平地圖符。然而,第二個子任務必須放置在一個新的插槽中。發生這種情況時,Flink會嘗試選擇一個空閒插槽,該空閒插槽與部署任務的一個輸入的插槽位於同一位置(同樣用於減少網絡通信)。由於node1只有一個插槽被佔用,因此31仍然是空閒的,所以它會將每個flatMap運算符的第二個子任務也部署到node1

現在同樣適用於翻滾窗口縮小操作。 Flink試圖共同定位窗口操作符的所有任務和輸入。由於其所有輸入都在node1node1上運行,因此它有足夠的空閒插槽來容納窗口操作員的6個子任務,因此它們將安排到node1。需要注意的是,1個窗口任務將在包含三個源和每個flatMap運算符的一個任務的插槽中運行。

我希望這解釋了爲什麼Flink只使用一臺機器的插槽來執行您的工作。

+0

這是有道理的。當我擴展這個拓撲結構以包含幾百個kafka主題時,問題就會出現。這些會傳播出去嗎? – ethrbunny

+0

卡夫卡話題的數量對於這裏的傳播不是決定性的,因爲每個話題的一個任務將放在同一個位置。每個主題的分區數量越多,因此每個源運營商的並行性決定了您需要的槽數。 'DataStream' API還提供'startNewResourceGroup()'方法,該方法強制將以下運算符放在不同的插槽中。據我所知,這不適用於來源。我將覈實並在必要時爲其打開JIRA問題。 –