Flink 大規(guī)模作業(yè)調(diào)度性能優(yōu)化
隨著 Flink 流批一體架構(gòu)不斷演進(jìn)和升級(jí),越來(lái)越多的用戶(hù)開(kāi)始選擇用 Flink 來(lái)同時(shí)承載實(shí)時(shí)和離線(xiàn)的業(yè)務(wù)。離線(xiàn)業(yè)務(wù)和實(shí)時(shí)業(yè)務(wù)有一定差異性,其中比較關(guān)鍵的一點(diǎn)是 ——?離線(xiàn)作業(yè)的規(guī)模通常都遠(yuǎn)遠(yuǎn)大于實(shí)時(shí)作業(yè)。超大規(guī)模的流批作業(yè)對(duì) Flink 的調(diào)度性能提出了新的挑戰(zhàn)。在基于 Flink 1.12 版本部署大規(guī)模流批作業(yè)時(shí),用戶(hù)可能會(huì)遇到以下瓶頸:
需要很長(zhǎng)時(shí)間才能完成作業(yè)的調(diào)度和部署; 需要大量?jī)?nèi)存來(lái)存儲(chǔ)作業(yè)的執(zhí)行拓?fù)鋱D以及部署時(shí)所需的臨時(shí)變量,并且在運(yùn)行過(guò)程中會(huì)出現(xiàn)頻繁的長(zhǎng)時(shí)間 GC,影響集群穩(wěn)定性;
為了優(yōu)化 Flink 調(diào)度大規(guī)模作業(yè)的性能,我們?cè)?Flink 1.13 版本和 1.14 版本進(jìn)行了以下優(yōu)化:
針對(duì)拓?fù)浣Y(jié)構(gòu)引入分組概念,優(yōu)化與拓?fù)湎嚓P(guān)的計(jì)算邏輯,主要包括作業(yè)初始化、Task 調(diào)度以及故障恢復(fù)時(shí)計(jì)算需要重啟的 Task 節(jié)點(diǎn)等等。與此同時(shí),該優(yōu)化降低了執(zhí)行拓?fù)湔加玫膬?nèi)存空間; 引入緩存機(jī)制優(yōu)化任務(wù)部署,優(yōu)化后部署速度更快且所需內(nèi)存更少; 基于邏輯拓?fù)浜蛨?zhí)行拓?fù)涞奶匦赃M(jìn)行優(yōu)化以加快 Pipelined Region 的構(gòu)建速度,從而降低作業(yè)初始化所需的時(shí)間。
一、性能評(píng)測(cè)結(jié)果
1.12 | 1.14 | 時(shí)間降低百分比(%) | |
作業(yè)初始化 | 11,431ms | 627ms | 94.51% |
任務(wù)部署 | 63,118ms | 17,183ms | 72.78% |
故障恢復(fù)時(shí)計(jì)算重啟節(jié)點(diǎn) | 37,195ms | 170ms | 99.55% |
二、基于拓?fù)浣Y(jié)構(gòu)的優(yōu)化

圖 1 目前 Flink 的兩種分發(fā)模式

三、優(yōu)化任務(wù)部署
目前任務(wù)部署包含以下幾個(gè)階段:
JobManager 在主線(xiàn)程內(nèi)為每一個(gè) Task 創(chuàng)建任務(wù)部署描述符 (TaskDeploymentDescriptor,以下簡(jiǎn)稱(chēng) TDD); JobManager 在異步線(xiàn)程內(nèi)將這些 TDD 進(jìn)行序列化; JobManager 通過(guò) RPC 通信將序列化后的 TDD 發(fā)送至 TaskManager; TaskManager 基于 TDD 創(chuàng)建任務(wù)并執(zhí)行。
3.1 為 ShuffleDescriptor 添加緩存機(jī)制
3.2 通過(guò) Blob 服務(wù)器分發(fā) ShuffleDescriptor

四、針對(duì) Pipelined Region 構(gòu)建的優(yōu)化



