Flink原理(一)——基礎架構

1、前言

  在講Flink基本結構之前,我們的先知道Flink是什麼?中文官網上的解釋是:Apache Flink 是一個框架和分佈式處理引擎,用於在無邊界和有邊界數據流上進行有狀態的計算[1]。關於無邊界和有邊界數據流的定義可以參考官網上的解釋,從其解釋上可以瞭解到Flink是一個框架和計算引擎,是用來處理數據流的。處理數據流並不意味着Flink僅僅能用於我們通常所說的流處理系統中,這裏數據流主要是爲了說明Flink處理數據的方式,是以流的形式進行的。其實不僅流處理,Flink也可以做到批處理,即Flink可以實現批/流一體化,至於如何實現的,這裏僅提及相關概念,後續博客會慢慢道來。

2、Flink基本架構

  2.1、Flink的基本架構圖[2]:

從圖中可知,Flink整個系統主要由兩個組件組成:JobManager、TaskManager組件,其架構是遵循主-從設計原則的,JobManager爲master結點、TaskManager爲Slave結點(也稱work結點),組件之間的通信是藉助Akka Framework。

  1)JobManager:負責整個Flink集羣任務的調度和資源分配。從client獲取提交的任務後,JobManager根據TaskManager中資源(TaskSlots)使用的情況,分配資源並命令TaskManager啓動任務。在這個過程中,JobManager會觸發checkpoint操作,TaskManager執行checkpoint操作,其中所有的checkpoint協調的過程都在JobManager中完成的。此外,若是任務失敗了,也由JobManager協調失敗任務的恢復。

  2)TaskManager:負責具體的任務執行和結點上資源申請和管理,多結點之間的數據交換也是在TaskManager上執行。Flink集羣中,每個worker(taskManager)對應的是一個JVM進程。

  換句話說,JobManager分配資源、任務,TaskManager擁有資源、啓動任務。一般在生產環境中,JobManager和TaskManager所在結點應是分離的,其目的主要是爲了保證TaskManager(基於內存的計算)不搶奪JobManager的資源。

  3)client客戶端:不是runtime的一部分,換句話說,Flink集羣啓動client提交的任務之後,client客戶端時可以斷開的,是可以不需要的。client不像JobManager和TaskManager對應着 flink集羣中的結點(或是物理機、或是虛擬機、或是容器),是觸發執行的一個抽象化,若程序在JobManager所在結點執行,則稱client在JobManager結點上,同樣,其也可以在TaskManager結點上。

  提交一個任務的正常流程是:client與JobManager構建Akka連接,將任務提交到JobManager上,JobManager根據已經註冊在JobManager中TaskManager的資源(TaskSlot)情況,將任務分配給有資源的TaskManager,並命令TaskManager啓動任務,TaskManager則從JobManager接受需所部屬的任務,使用slot資源啓動task,建立數據接入的網絡連接,然後接受數據並開始處理。

  2.2、taskSlot

  每個task slot是TaskManager的一部分,若一個taskManager有三個taskSlot,則這三個taskSlot會均分這個TaskManager的資源(僅內存,不包括CPU)。有多個slot意味着同一個JVM中會有多個子任務,這些任務會共享JVM的TCP連接和心跳信息。這裏要說明的是,slot的個數不是subtask的個數是一一對應,一個slot中可以有多個subtask。在默認情況下,同一個job中的子任務(subtask)是可以共享一個slot的。這裏涉及slot共享的概念,後續博客中分析。

 

參考: 

[1]https://flink.apache.org/zh/flink-architecture.html

[2]https://ci.apache.org/projects/flink/flink-docs-release-1.6/concepts/runtime.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章