Flink(一)

一、介紹

Apache Flink(德語:快速靈巧,原德國柏林大學基金會項目)是一個框架分佈式處理引擎,用於對無界和有界數據流進行狀態計算。ms級別水平。data flow+event sequence。

流數據更真實地反映了我們的生活方式,傳統數據架構是基於有限數據集的離線處理。

  • 目標:
    低延遲、高吞吐、結果的準確頂和良好的容錯性。

  • 應用場景:
    電商和市場營銷,數據報表、廣告投放、業務流程需要;
    物聯網(everything has id and creates data),傳感器實時數據採集和顯示、實時報警、交通運輸業;
    電信業,基站流量調配;
    銀行和金融業,實時結算和通知推送、實時監測異常行爲。

  • 數據架構
    (1)傳統架構
    聯機事務處理過程(OLTP)
    在這裏插入圖片描述
    聯機分析處理過程(OLAP):將數據從業務數據ETL(Extract-Transform-Load,抽取-轉換-加載)到數倉,再進行分析和查詢。
    在這裏插入圖片描述

(2)流式處理
有狀態的流式處理
data pipe line,借鑑了事務處理模式,本地狀態提速(週期性檢查表存儲至遠程)。
缺點:分佈式延遲會導致亂序問題。
在這裏插入圖片描述

Lambda架構
用兩套系統(批處理,保證結果正確性+流處理,實時計算結果),同時保證延遲和結果準確(校驗結果)。
缺點:重複造輪子,維護。
在這裏插入圖片描述

Flink架構
Spark Streaming將批處理的批次分的足夠小,基於批處理引擎的流計算(micro-batching)。
在這裏插入圖片描述

  • 主要特點
    1.事件驅動(Event-driven):data pipe的一部分,根據本地狀態快速響應
    在這裏插入圖片描述
    2.基於流:離線數據是有界的流,實時數據是無界流
    3.分層API:SQL/Table API(dynamic tables)、DataStream API(streams、windows)、ProcessFunction API(events、state、time)
    4.支持事件時間(event-time)和處理時間(processing-time)語義;精確一次(exactly-one)的狀態一致性保證;低延遲,ms級,每秒處理百萬個事件;存儲系統連接廣;高可用,動態擴展,實現7*24小時。

二、安裝部署

三種方式:Standalone模式、Yarn模式(必須hadoop支持版本且有HDFS)、Kubernetes部署(容器化部署)
下載地址

master配置jobmanager,slaves配置taskmanager(幹活的)。配置的rest.port: 8081爲可視化UI端口。H

每個算子都可以單獨設置並行度setParallelism(),默認並行度自行設置。
taskmanager.numberOfTaskSlots: 1 爲每個Flink TaskManager在集羣中提供處理槽, 插槽的數量通常與每個TaskManager的可用CPU內核數成比例

命令行提交job:

./bin/start-cluster.sh
./bin/flink run -c ${class-path} -p ${parallelism-number} ${jar-path} ${parameters}
./bin/flink list  # 可以加--all
./bin/flink cancel ${job-id}
./bin/stop-cluster.sh

三、運行架構

1. 運行時的組件

組件:作業管理器(Job Manager)、任務管理器(Task Manager)、資源管理器(Resource Manager)、分發器(Dispacher)

(1)Job Manager
控制一個應用程序執行的主進程,即一個應用程序對應一個Job Manager。
Job Manager會接受的應用程序包括:作業圖(Job Graph)、邏輯數據流圖、打包了所有的類/庫/其他資源的JAR包。Job Manager會把Job Graph轉換成一個物理層面的數據流圖,稱爲執行圖(Execution Graph),包含所有可以併發執行的任務。
Job Manager會向Resource Manager請求執行任務必要的資源(Task Manager上的Slot),將Execution Graph分發到真正運行它們的Task Manager上。
運行過程中Job Manager會負責所有需要中央協調的操作,如檢查點(Check Points)的協調。

(2)Task Manager
Flink中的工作進程,每個Task Manager包含一定數量的插槽(Slots,線程運行的資源),插槽限制了Task Manager能夠執行的任務數量。
啓動後,Task Manager會向Resource Manager註冊它的插槽。收到Resource Manager的指令後,Task Manager會將一個或多個插槽提供給Job Manager分配任務來執行調用。
執行過程中,一個Task Manager可以喝其他運行同一應用程序的Task Manager交換數據(分佈式集羣)。

(3)Resource Manager
主要負責管理Task Manager的Slot,Slot是Flink中定義的處理資源單元。Flink爲不同的環境和資源管理器工具提供了不同的Resource Manager(Yarn、k8s)。

(4)Dispacher
非必需,可跨作業運行,爲應用提供了REST接口。當一個應用被提交執行時,Dispacher會啓動並將應用交給一個Job Manager。Dispatcher也會啓動一個Web UI。

2. Flink任務提交流程

YARN和K8S有所不同。
在這裏插入圖片描述

3. 任務調度原理

執行:Flink程序首先生產一個Dataflow Graph(DG),通過Client將Task(DG和Code)提交到JM(通過Dispatcher)。JM接收到Task之後,將DG轉換成Execution Graph發送給TM,對應的Task就可以在每個Slot上執行了。
在這裏插入圖片描述

4. TaskManager(TM)和Slots

Flink中每一個TM都是一個JVM進程,會在獨立的線程上執行一個或多個subtask。爲了控制一個TM能接收多個task,TM通過task slot來進行控制。

Slots是靜態的概念,指TM具有的併發執行的能力。用來隔離內存,一般根據CPU核心數量來設定。
默認情況下,Flink允許子任務共享Slot,即使是不同任務的子任務,即一個Slot可以保存作業的整個管道。

5. DataFlow

Flink程序都是由三部分組成:Source(讀取數據源)、Transformation(數據處理轉換)、Sink(數據輸出)。
運行時,Flink上運行的程序會被映射成DataFlow(邏輯數據流),一個DataFlow以一個或多個Source開始,以一個或多個Sink結束,程序中的轉換運算(Transformations)跟DataFlow中的算子(operator)一一對應,類似於任意的有向無環圖(DAG)

6. ExecutionGraph

Flink中的執行圖可以分成四層:StreamGraph->JobGraph->ExecutionGraph->物理執行圖。
StreamGraph:根據用戶通過Stream API編寫的代碼在Client生成的最初的圖,表示程序的拓撲結構。(多少個Operator對應多少個Task)
JobGraph:StreamGraph經過優化後生成的提交給JM的數據結構,主要講多個符合條件的節點chain在一起作爲一個節點。(符合條件的Operator合併爲一個Task)
ExecutionGraph:JM根據JobGraph生成的並行化版本,是調度層最核心的數據結構。(根據並行度做出並行版本)
物理執行圖:JM根據ExecutionGraph對Job進行調度後,在各個TM上部署Task後形成的圖,並非一個具體的數據結構。(TM上執行的物理含義)

7. Parallelism(數據並行範圍)

一個特定Operator的Subtask的個數被稱爲Parallelism(並行度),一般地,一個Stream的並行度可被認爲是其所有Operator中最大的Parallelism。
一個程序中,不同Operator可以有不同的並行度,之間傳輸數據的形式可以是one-to-one(forwarding)模式也可以是redistributing模式,取決於Operator的種類。

One-to-One:(窄依賴)Stream維護者分區以及元素的順序,如map算子的子任務看到的元素個數及順序跟source算子的子任務產生的元素個數、順序相同。map、filter、flatMap等算子均爲此模式。
Redistributing:(寬依賴)Stream分區會發生改變,每個Operator的Subtask依據所選擇的transformation發送數據到不同的目標任務。如keyBy基於hashCode重分區,broadcast和rebalance會隨機重新分區。

8. Operator Chains(任務鏈)

要求:並行度相同one-to-one操作,會合成爲一個任務鏈。
Flink採用任務鏈的優化技術,可以在特定條件下減少本地通信的開銷,不需要任務間數據通信的傳輸(變爲同一個線程內方法調用)。
若某個算子複雜,可以通過API取消任務鏈合併、開啓新鏈,提升性能。


發佈了51 篇原創文章 · 獲贊 10 · 訪問量 9992
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章