一、Flink集群中各角色運行架構
先說Flink集群中的角色吧,有三個分別是客戶端(Client)、JobManager、TaskManager。
客戶端負責接收作業任務并進行解析,將解析后的二進制數據發送給JobManager;JobManager是作業調度中心,負責對所有作業進行調度;TaskManager是作業執行的工作節點,負責執行具體的工作。其大致流程為:
那么更具體的各個角色的功能是如下圖的:
三個角色之間都是通過Actor通信系統進行通信的。
客戶端的具體功能就是:解析腳本提交過來的參數并進行封裝,然后將任務提交給JobManager。
JobManager中又分為了三個組件:分發器、JobMaster、資源管理器。分發器負責接收任務并為每一個任務開啟一個新的JobMaster組件;JobMaster負責處理單個的作業,在作業提交后,他會將JobGraph轉化為一個物理層面的數據流圖,然后向資源管理器發送請求獲取資源,一旦獲取到資源以后,JobMaster就會將這個數據流圖發送到TaskManager上去執行。資源管理器就是接收JobMaster的資源請求然后去向TaskManager申請資源。
二、并行度
在執行作業時,要處理的數據量很大,可以將一個算子操作復制多分,多個算子共同的執行。那么一個算子的子任務的個數就是這個算子的并行度。而一個程序的并行度是這個程序中所有算子中的最大并行度的值。
三、算子鏈
在介紹算子鏈之前應該先介紹不同算子之間的數據流通形式,有一對一形式和重分區形式。一對一形式就是數據由前一個算子直接流向下一個算子;重分區就是數據從前一個算子會進行重新分區的操作之后再發給后面的算子。
算子鏈就是對并行度相同的且是一對一的算子進行的合并操作,合并之后兩個算子就在同一個子任務中執行。這樣做的好處就是可以減少不同線程之間的數據交換的時延。
四、任務槽(slot)
Flink中的每一個TaskManager都是一個JVM進程,他可以啟動多個線程來執行任務。但是JVM進程能申請到的資源是有限的,它能夠讓多少個任務來執行呢?每個任務又能分配多少資源呢?這些都是TaskManager設計時的問題。為了解決這些問題,TaskManager在設計時以任務槽(slot)為最小資源分配單位來向線程任務分配資源。這樣每個TaskManager就是最多讓slot的數量的任務來執行。
任務槽(slot)和并行度都和程序的并行執行有關系。任務槽代表了程序能并行執行的最大程度,是靜態的概念;并行度是程序在執行過程中的實際并發程度,是動態的概念。所以必須要求開啟的TaskManager的總的任務槽的數量要比設置的并行度的值要大。