[英]flink - cluster not using cluster
實際上,Flink故意在單個TaskManager上安排您的工作。 為了理解它,讓我快速解釋Flink的資源調度算法。
首先,在Flink世界中,插槽可以容納多個任務(操作員的並行實例)。 實際上,它可以容納每個運算符的一個並行實例。 這是因為Flink不僅以流方式執行流作業,而且還執行批處理作業。 用流式傳輸方式,我的意思是Flink使數據流圖的所有運算符聯機,以便中間結果可以直接流式傳輸到下游運算符並在其中被使用。 默認情況下,Flink嘗試在一個插槽中合並每個操作員的一項任務。
當Flink將任務調度到不同的插槽時,它會嘗試將任務及其輸入放在同一位置,以避免不必要的網絡通信。 對於源,共置位置取決於實現方式。 例如,對於基於文件的源,Flink嘗試將本地文件輸入拆分分配給不同的任務。
因此,如果我們將此應用於您的工作,那么我們將看到以下內容。 您有三個具有並行性的不同資源1。所有資源都屬於同一資源共享組,因此每個操作員的單個任務將部署到同一插槽。 最開始的時隙被隨機地從可用的情況下選擇(實際上它取決於的順序TaskManager
登記在JobManager
),然后填充。 假設所選的插槽位於機器node1
。
接下來,我們有三個並行度為2的平面映射運算符。這里,每個平面映射運算符的兩個子任務之一可以再次部署到已容納三個源的同一插槽中。 但是,第二個子任務必須放置在新的插槽中。 發生這種情況時,Flink會嘗試選擇一個空閑插槽,該空閑插槽與部署任務輸入之一的插槽位於同一位置(再次減少網絡通信)。 由於node1
僅有一個插槽被占用,因此31
個插槽仍然空閑,因此它將把每個flatMap運算符的第二個子任務也部署到node1
。
現在,同樣適用於滾動窗口縮小操作。 Flink試圖將窗口運算符的所有任務與其輸入共同定位。 由於其所有輸入都在node1
運行,並且node1
具有足夠的可用插槽以容納窗口運算符的6個子任務,因此它們將被調度到node1
。 重要的是要注意,一個窗口任務將在包含三個源和每個flatMap運算符一個任務的插槽中運行。
我希望這可以解釋為什么Flink僅將一台計算機的插槽用於執行工作。
問題是您要在無鍵(未分組)流上構建全局窗口 ,因此該窗口必須在一台計算機上運行。
也許您還可以用不同的方式表達應用程序邏輯,以便可以對流進行分組。
“(未設置)”部分可能是Flink的DataStream
API中的一個問題,該API沒有設置默認的運算符名稱。 針對DataSet
API實現的作業將如下所示:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.