1. 程式人生 > >[原始碼解析] Flink的Slot究竟是什麼?(1)

[原始碼解析] Flink的Slot究竟是什麼?(1)

# [原始碼解析] Flink的Slot究竟是什麼?(1) [ToC] ## 0x00 摘要 Flink的Slot概念大家應該都聽說過,但是可能很多朋友還不甚瞭解其中細節,比如具體Slot究竟代表什麼?在程式碼中如何實現?Slot在生成執行圖、排程、分配資源、部署、執行階段分別起到什麼作用?本文和下文將帶領大家一起分析原始碼,為你揭開Slot背後的機理。 ## 0x01 概述 & 問題 ### 1.1 Fllink工作原理 從下圖可以大致瞭解Flink的工作原理,即從提交Job到執行具體Task的過程。我們可以看到在具體執行時候,Task是依附於某一個Slot上的。 ``` +--------------+ | +----------+ | +--------+ +--------+ +---------+ +---------+ | |Task Slot | | | Flink | Submit | Job | Submit | Job | Submit Task | Task |Execute Task | +----------+ | |Program +--------->+ Client +-------> | Manager +------------->+ Manager +------------>+ | +--------+ +--------+ +---------+ +---------+ | +----------+ | | |Task Slot | | | +----------+ | +--------------+ ``` 下圖是為了手機上觀看。 ![](https://img2020.cnblogs.com/blog/1850883/202008/1850883-20200824152108123-1430682613.png) ### 1.2 問題 帶著問題學習比較好,我這裡整理了幾個問題,希望有一定代表性: - Slot究竟是什麼? - Slot在程式碼中是如何實現的? - Slot定義裡面究竟有什麼?CPU?記憶體? - Slot是怎麼實現各種隔離的? - TM中需要分成多少個Slot? - Slot是怎麼分配給Task的?或者說Task是怎麼跑在Slot上的? 如果想搞清楚這些問題可不是一件容易的事情,需要把Flink任務執行的流程梳理一遍才行。下面我就帶著大家探尋一下。 ## 0x02 示例程式碼 ### 2.1 示例程式碼 示例程式碼就是Flink本身自帶的WordCount。只不過添加了一些配置: - taskmanager.numberOfTaskSlots 是為了設定有幾個taskmanager。 - 其他是為了除錯,加長了心跳時間或者超時時間。 ```java Configuration conf = new Configuration(); conf.setString("heartbeat.timeout", "18000000"); conf.setString("resourcemanager.job.timeout", "18000000"); conf.setString("resourcemanager.taskmanager-timeout", "18000000"); conf.setString("slotmanager.request-timeout", "18000000"); conf.setString("slotmanager.taskmanager-timeout", "18000000"); conf.setString("slot.request.timeout", "18000000"); conf.setString("slot.idle.timeout", "18000000"); conf.setString("akka.ask.timeout", "18000000"); conf.setString("taskmanager.numberOfTaskSlots", "1"); final LocalEnvironment env = ExecutionEnvironment.createLocalEnvironment(conf); ``` ## 0x03 從Slot角度看系統劃分 ### 3.1 Flink元件 其實系統還是那麼劃分,只是我們從Slot資源分配角度看會更清晰。 一個 Flink Cluster 是由一個 Flink Master 和多個 Task Manager 組成的,一個 Flink Master 中有一個 Resource Manager 和多個 Job Manager。 - Flink Master 中每一個 Job Manager 單獨管理一個具體的 Job。 - Job Manager 中的 Scheduler 元件負責排程執行該 Job 的 DAG 中所有 Task,發出資源請求,即整個資源排程的起點; - JobManager 中的 Slot Pool 元件持有分配到該 Job 的所有資源。 - Flink Master 中唯一的 Resource Manager 負責整個 Flink Cluster 的資源排程以及與外部排程系統對接,這裡的外部排程系統指的是 Kubernetes、Mesos、Yarn 等資源管理系統。 - Task Manager 負責 Task 的執行,其中的 Slot 是 Task Manager 資源的一個子集,也是 Flink 資源管理的基本單位,Slot 的概念貫穿資源排程過程的始終。 Flink Master 和 Task Manager 是程序級元件,其他的元件都是程序內的元件
。 ### 3.2 Slot的由來 前面我們介紹了 TaskManager 是一個 JVM 程序,並會以獨立的執行緒來執行一個task或多個subtask。 所以在 多執行緒處理 的 TaskManager 的內部是:在不同的執行緒上去執行一個或者多個它的子任務。而這個執行緒到底能執行多少個子任務呢? 為了控制內部執行緒執行子任務的個數,即為了控制一個 TaskManager 能接受多少個 task,就提出了slots概念。slots就是TaskManager的固定大小資源的一個集合。ResourceManager在做資源分配管理的時候,最小的單位就是slot。 Slot概念的優勢就在於,如果JobMaster通過分發而來的作業,可以獨立的在不同的Slot中執行。有一點類似於資源的隔離,這樣,就可以儘可能的提高整個資源的效率。 在子任務同屬一個 job 時,Flink還允許共享Slot。之所以允許共享,主要是因為既可以迅速的執行一些佔用資源較小的任務,又可以從邏輯上抽離對平行計算是資源的消耗的多餘計算(這點和虛擬記憶體有異曲同工之妙)。通過Map-reduce的對映來更好的進行作業和任務的執行。 ### 3.3 資源分配 Flink 的資源排程是一個經典的兩層模型,其中從 Cluster 到 Job 的分配過程是由 Slot Manager 來完成,Job 內部分配給 Task 資源的過程則是由 Scheduler 來完成。Scheduler 向 Slot Pool 發出 Slot Request(資源請求),Slot Pool 如果不能滿足該資源需求則會進一步請求 Resource Manager,Resource Manager中具體來滿足該請求的元件是 Slot Manager。 在 Operator 和 Task 中間的 Chaining 是指如何用 Operator 組成 Task 。在 Task 和 Job 之間的 Slot Sharing 是指多個 Task 如何共享一個 Slot 資源,這種情況不會發生在跨作業的情況中。在 Flink Cluster 和 Job 之間的 Slot Allocation 是指 Flink Cluster 中的 Slot 是怎樣分配給不同的 Job 。 先使用 http://asciiflow.com/ 畫個圖總結下。 ```java +------------------------------------------+ | TaskManager | | +-----------------------------------+ | | | TaskManagerServices | | 2.Status Report | | +-------------------------+ | +--------------------+ | | | TaskSlotTable | | | | | | | +------------------+ | | | 1.Reqister | | | | |TaskSlot TaskSlot | | | +---------------+ | | | | +------------------+ | | | | | | | +-------------------------+ | | | | | +-----------------------------------+ | <---------+ | | +------------------------------------------+ 6.Request | | | | ^ | | | | 7.Offer | 8.submitTask | | | v | | v v +-----------------------+-----------+----------------+ +---+---+----+-----------+ | JobManager | | | | +-------------------------------------+ | | ResourceManager | | | Scheduler | | | | | | +---------------------------------+ | | | +--------------------+ | | | | LogicalSlot PhysicalSlot | | | | | SlotManager | | | | +---------------------------------+ | | | | | | | +-------------------------------------+ | | | +----------------+ | | | | | | | | | | | | |3.allocateSharedSlot| |4.allocateSingleSlot | | | |TaskManagerSlot | | | | v | | | | | | | | | +------------------+-+ | +----------------+ | | | | | | | | | SlotSharingManager| +->+ SlotPool | |5.Request| | | | | | | | +----------------+ | | +------------+ +---------> | | +----------------+ | | | | |MultiTaskSlot | | | |AllocatedSlot | | | | | | | | |SingleTaskSlot | | | | + | | | +--------------------+ | | | +----------------+ | | +------------+ | | +------------------------+ | +--------------------+ +----------------+ | +----------------------------------------------------+ ``` 圖. Flink 資源管理相關元件 下面這個圖是為了在手機上觀看。 ![](https://img2020.cnblogs.com/blog/1850883/202008/1850883-20200824152159822-1848321385.png) 如圖,Cluster 到 Job 的資源排程過程中主要包含五個過程。 - TE註冊(就是上圖中的 1,2 兩項) - Reqister : 當 TE 啟動之後,會向 RM 註冊自己和自己內部的Slot。 - Status Report:TE啟動之後,會定期向 RM 進行心跳彙報,在心跳 payload 中,會攜帶 Slot 資訊,RM 會隨即更新自己內部Slot狀態。 - JM內部分配(就是上圖中的 3,4 兩項) - allocateSingleSlot : Scheduler 向 Slot Pool 傳送請求,如果 Slot 資源足夠則直接分配,如果 Slot 資源不夠,則由 Slot Pool 再向 Slot Manager傳送請求(此時即為 Job 向 Cluster 請求資源) - allocateSharedSlot : Scheduler 向 Slot Sharing Manager 傳送請求,Slot Sharing Manager 構建好Slot樹之後, 向 Slot Pool 傳送請求,如果 Slot 資源足夠則直接分配,如果 Slot 資源不夠,則由 Slot Pool 再向 Slot Manager傳送請求(此時即為 Job 向 Cluster 請求資源) - Job 向 Cluster 請求資源(就是上圖的 5,6 兩項) - 如果 Slot Manager 判斷叢集當中有足夠的資源可以滿足需求,那麼就會向 Task Manager 傳送 Request 指令,Slot Pool 再去滿足 Scheduler 的資源請求。 - 在 Active Resource Manager 資源部署模式下,當 Resource Manager 判定 Flink Cluster 中沒有足夠的資源去滿足需求時,它會進一步去底層的資源排程系統請求資源,由排程系統把新的 Task Manager 啟動起來,並且 TaskManager 向 Resource Manager 註冊,則完成了新 Slot 的補充。 - TE Offer Slot(就是上圖的第 7 項) - Offer : Task Manager 就會提供 Slot 給 Slot Pool。 - JM 會向 TE提交 Task(就是上圖的第 8 項) - submitTask : JM 會更新內部Slot狀態,然後向 TE 提交任務。 這些元件具體闡釋如下。 ### 3.4 Task Manager 範疇 Task Manager 內部相應元件為 TaskManagerServices,TaskSlotTableImpl。TaskManagerServices 是提供了 TaskManager 的基礎服務,其中就包括了 Slot相關功能 TaskS