大資料學習之Flink(二)
Flink執行架構
Flink 的執行時架構中,最重要的就是兩大元件:作業管理器(JobManger)和工作管理員(TaskManager)。對於一個提交執行的作業,JobManager 是真正意義上的“管理者”(Master),負責管理排程,所以在不考慮高可用的情況下只能有一個;而 TaskManager 是“工作者”(Worker、Slave),負責執行任務處理資料,所以可以有一個或多個 作業提交和任務處理時的執行架構
JobManager和TaskManager的啟動方式:
作為獨立叢集的程序,直接在叢集上使用
在容器中使用
有資源管理平臺排程啟動
TaskManager 啟動之後,JobManager 會與它建立連線,並將作業圖(JobGraph)轉換成可執行的“執行圖”(ExecutionGraph)分發給可用的 TaskManager,然後就由 TaskManager 具體執行任務
作業管理器(JobManager)
JobManager 是一個 Flink 叢集中任務管理和排程的核心,是控制應用執行的主程序。也就是說,每個應用都應該被唯一的 JobManager 所控制執行
JobManager的三大元件:
1)JobMaster:是JobManager中最核心的元件,負責處理單獨的作業,JobMaster和具體的job是一一對應的,多個job可以執行在一個flink叢集中,每個job都有一個自己的JobMaster
2)Resourcemanager資源管理器:主要負責資源的分配與管理,在flink中主要是指TaskManager的任務槽(flink叢集資源排程單元 包含了CPU和記憶體資源)
3)分發器(Dispatcher):主要負責提供一個rest介面,用來提交作業,並且負責為每一個新提交的作業啟動一個新的JobMaster元件
工作管理員(TaskManager)
TaskManager 是 Flink 中的工作程序,負責資料流的具體計算任務(task)。Flink 叢集中必須至少有一個 TaskManager;當然由於分散式計算的考慮,通常會有多個 TaskManager 執行,每一個 TaskManager 都包含了一定數量的任務槽(task slots)。Slot 是資源排程的最小單位,slots的數量限制了 TaskManager 能夠並行處理的任務數量。
啟動之後,TaskManager 會向資源管理器註冊它的 slots;收到資源管理器的指令後,TaskManager 就會將一個或者多個槽位提供給 JobMaster 呼叫,JobMaster 就可以分配任務來執行了。
在執行過程中,TaskManager 可以緩衝資料,還可以跟其他運行同一應用的 TaskManager交換資料
作業提交流程
Flink的提交流程隨著部署模式和資源管理平臺的不同會有不同的變化
作業提交流程的具體步驟:
(1)一般情況下,由客戶端(App)通過分發器提供的REST介面,將作業提交給JobManager
(2)由分發器啟動 JobMaster,並將作業(包含 JobGraph)提交給 JobMaster。
(3)JobMaster 將 JobGraph 解析為可執行的 ExecutionGraph,得到所需的資源數量,然後向資源管理器請求任務槽資源(slots)。
(4)資源管理器判斷當前是否由足夠的可用資源;如果沒有,啟動新的 TaskManager。
(5)TaskManager 啟動之後,向 ResourceManager 註冊自己的可用任務槽(slots)。
(6)資源管理器通知 TaskManager 為新的作業提供 slots。
(7)TaskManager 連線到對應的 JobMaster,提供 slots。
(8)JobMaster 將需要執行的任務分發給 TaskManager。
(9)TaskManager 執行任務,互相之間可以交換資料
獨立模式下的作業提交流程
在獨立模式(Standalone)下,只有會話模式和應用模式兩種部署方式。兩者整體來看流程是非常相似的:TaskManager 都需要手動啟動,所以當 ResourceManager 收到 JobMaster 的請求時,會直接要求 TaskManager 提供資源。而 JobMaster 的啟動時間點,會話模式是預先啟動,應用模式則是在作業提交時啟動
YARN叢集環境下作業的提交流程
1)會話模式
在會話模式需要先啟動一個YARN-Session會話,這樣會建立一個flink叢集
這裡只啟動了 JobManager,而 TaskManager 可以根據需要動態地啟動。在 JobManager 內部,由於還沒有提交作業,所以只有 ResourceManager 和 Dispatcher 在執行
提交作業的流程
(1)客戶端通過 REST 介面,將作業提交給分發器。
(2)分發器啟動 JobMaster,並將作業(包含 JobGraph)提交給 JobMaster。
(3)JobMaster 向資源管理器請求資源(slots)。
(4)資源管理器向 YARN 的資源管理器請求 container 資源。
(5)YARN 啟動新的 TaskManager 容器。
(6)TaskManager 啟動之後,向 Flink 的資源管理器註冊自己的可用任務槽。
(7)資源管理器通知 TaskManager 為新的作業提供 slots。
(8)TaskManager 連線到對應的 JobMaster,提供 slots。
(9)JobMaster 將需要執行的任務分發給 TaskManager,執行任務
單作業模式(per-job)
在單作業模式下,Flink 叢集不會預先啟動,而是在提交作業時,才啟動新的 JobManager
(1)客戶端將作業提交給 YARN 的資源管理器,這一步中會同時將 Flink 的 Jar 包和配置上傳到 HDFS,以便後續啟動 Flink 相關元件的容器。
(2)YARN 的資源管理器分配容器(container)資源,啟動 Flink JobManager,並將作業提交給 JobMaster。這裡省略了 Dispatcher 元件。
(3)JobMaster 向資源管理器請求資源(slots)。
(4)資源管理器向 YARN 的資源管理器請求容器(container)。
(5)YARN 啟動新的 TaskManager 容器。
(6)TaskManager 啟動之後,向 Flink 的資源管理器註冊自己的可用任務槽。
(7)資源管理器通知 TaskManager 為新的作業提供 slots。
(8)TaskManager 連線到對應的 JobMaster,提供 slots。
(9)JobMaster 將需要執行的任務分發給 TaskManager,執行任務
應用模式(application)
應用模式與單作業模式的提交流程非常相似,只是初始提交給 YARN 資源管理器的不再是具體的作業,而是整個應用。一個應用中可能包含了多個作業,這些作業都將在 Flink 叢集中啟動各自對應的 JobMaster。
名詞解釋
資料流圖
flink的程式由三部分組成:source、transformation、sink
source表示源運算元 負責讀取資料來源
transformation表是轉換運算元,利用各種運算元進行各種加工
sink表示下沉運算元 負責資料的輸出
flink程式執行時會被對映成所有運算元按照邏輯順序連線在一起的一張圖 稱為資料流圖
並行度
把一個運算元操作,“複製”多份到多個節點,資料來了之後就可以到其中任意一個執行。這樣一來,一個運算元操作就被拆分成了多個並行的“子任務”(subtasks),再將它們分發到不同節點,就真正實現了平行計算
並行度的設定
程式碼中:setParallelism(2)
提交作業是設定:-p 2
配置檔案中:parallelism.default: 2
作業圖(JobGrape)、執行圖(ExecutionGrape)
flink執行時會將程式對映成資料流圖 需要將資料流圖進一步解析,轉化為物理執行圖
資料流圖-》作業圖-》執行圖-》物理圖