[原始碼解析] Flink的Slot究竟是什麼?(1)
阿新 • • 發佈:2020-08-24
# [原始碼解析] 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