![](/img/trans.png)
[英]How to understand slot sharing and parallelism in Apache Flink
[英]Apache Flink - is it possible to evenly distribute slot sharing groups?
我們有一個包含操作的管道,分為 2 個工作負載 - Source -> Transform
位於第一組並且是 CPU 密集型工作負載,它們被放入同一個插槽共享組中,比如說source
。 和Sink
,RAM 密集型工作負載,因為它使用批量上傳並在內存中保存大量數據。 它發送到sink
插槽共享組。
此外,我們有不同的Source -> Transform
工作負載和Sink
工作負載的並行度級別,因為第一個受到源並行度的限制。 因此,例如,我們的Source -> Transform
並行度為 50,同時Sink
並行度為 78。我們有 8 個 TM,每個都有 16 個內核(因此也有插槽)。
在這種情況下,我們理想的插槽分配策略似乎是在每個 TM 上為Source -> Transform
分配 6-7 個插槽,其余的 - 用於Sink
領先的 CPU-RAM 工作負載大致均勻地分布在所有 TM 上。
所以,我想知道是否有一些配置設置可以告訴均勻分配插槽共享組?
我只找到了cluster.evenly-spread-out-slots配置參數,但我不確定它是否真的均勻分布插槽共享組,而不僅僅是插槽 - 例如,我得到 10 個Source -> Transform
TM Source -> Transform
同時我會Source -> Transform
任務期待 6 或 7。
那么,問題是是否可以告訴 Flink 跨集群均勻分布插槽共享組? 或者可能還有其他可能做到這一點?
在任務管理器之間均勻分布 Flink 運算符似乎與我的問題有點相似,但我主要詢問插槽共享組分布。 本主題還僅包含使用cluster.evenly-spread-out-slots 的建議,但此后可能發生了一些變化。
我嘗試過一次來實現這一點,但問題是 Flink 沒有提供啟用操作員放置的功能。 我能得到的關閉是使用.map(...).slotSharingGroup("name");
. 正如關於“ 設置插槽共享組”的文檔所說:
設置操作的槽位共享組。 Flink 會將具有相同槽共享組的操作放在同一個槽中,而將沒有槽共享組的操作保留在其他槽中。 這可用於隔離插槽。 如果所有輸入操作都在同一個槽共享組中,則槽共享組從輸入操作繼承。 默認插槽共享組的名稱為“default”,可以通過調用 slotSharingGroup("default") 將操作顯式放入該組。
someStream.filter(...).slotSharingGroup("name");
因此,我根據我擁有的任務槽數量以及並行度定義了不同的組。
我能夠找到一種解決方法來獲得插槽共享組的均勻分布。
從 flink 1.9.2 開始,引入了 even tasks 分發功能,可以通過flink-conf.yaml
中的cluster.evenly-spread-out-slots: true
flink-conf.yaml
: FLINK-12122 將任務平均分配到所有可用的注冊的 TaskManagers 。 我試圖啟用它,但它不起作用。 經過一番挖掘,我設法找到了開發人員的評論,該評論指出此功能僅在獨立模式下有效,因為它需要預先分配資源 - https://issues.apache.org/jira/browse/FLINK-12122 ?focusedCommentId=17013089&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-17013089” :
該功能僅保證在調度時注冊的一組 TM 中分散任務。 因此,當您使用活動 Yarn 模式並提交第一個作業時,將不會注冊任何 TM。 因此,Flink 將分配第一個容器,將其填滿,然后僅分配一個新容器。 但是,如果您以獨立模式啟動 Flink,或者在 Yarn 上完成第一個作業后仍有一些 TM 注冊,那么下一個作業將被分散。
因此,我們的想法是使用增加的空閑容器超時設置啟動一個分離的紗線會話,首先提交一些短暫的假作業,這將簡單地從 YARN 獲取所需數量的資源並完成,然后立即啟動主管道,它將分配給已經分配的容器,在這種情況下, cluster.evenly-spread-out-slots: true
可以解決問題並均勻分配所有插槽共享組。
因此,總而言之,為了在作業中獲得均勻分布的插槽共享組,做了以下工作:
resourcemanager.taskmanager-timeout
已增加,以允許在為空閑任務管理器釋放容器之前提交主作業。 我將其增加到 1 分鍾,這就足夠了。yarn-session
並動態地向它提交作業。val env = StreamExecutionEnvironment.getExecutionEnvironment
val job = env
.fromElements(0)
.map { x =>
x * 2
}
.setParallelism(parallelismMax)
.print()
val jobResult = env.execute("Resources pre-allocation job")
println(jobResult)
print("Done. Starting main job!")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.