Flink的基本概念與架構

概述

Flink是構建在數據流之上的一款有狀態計算框架。通常被人們稱爲第三代大數據分析方案

第一代大數據處理方案:Hadoop Map Reduce 靜態批處理 | Storm實時流計算,兩套獨立的計算引擎,開發難度大。

第二代大數據處理方案: Spark RDD靜態批處理、Spark Streaming(DStream)實時流計算(實時性差),統一的計算引擎 難度小。

第三代大數據處理方案:Apache Flink DataStream 流處理、Flink DataSet 批處理框架 2014年12月可以看出spark和Flink幾乎同時誕生,但是Flink之所以成爲第三代大數據處理方案,原因是因爲早期人們對大數據分析的認知或者業務場景大都停留在批處理領域。才導致了Flink的發展相比較於Spark 較爲緩慢,直到2017年人們才慢慢將 批處理開始轉向流處理

更多介紹:https://blog.csdn.net/weixin_38231448/article/details/100062961
流計算場景:實時計算領域,系統監控、輿情監控、交通預測、國家電網、疾病預測,銀行/金融風控。

Spark VS Flink
在這裏插入圖片描述
Flink 核心是一個流式的數據執行引擎,其針對數據流的分佈式計算提供了數據分佈、數據通信、以及容錯機制等功能。基於流執行引擎,Flink提供了諸多更高抽象層的API以便用戶編寫分佈式任務。
DataSet API:對靜態數據進行批處理操作,將靜態數據抽象成分佈式的數據集,用戶可以方便的使用Flink提供的各種操作符對分佈式數據集進行處理,支持Java、Scala、和Python。
DataStream API:對數據流進行流處理操作,將流式的數據抽象成分佈式的數據流,用戶可以方便地對分佈式數據進行各種操作,支持Java和Scala。

Table API:對結構化數據進行查詢操作,將結構化數據抽象成關係表,並通過類SQL的DSL對關係表進行各種查詢操作,支持Java和Scala。此外,Flink還針對特定的應用領域提供了領域庫

Flink ML,Flink的機器學習庫,提供了機器學習Pipelines API並實現了多種機器學習算法。

Gelly,Flink的圖計算庫,提供了圖計算的相關API及多種圖計算算法實現。

Flink 架構

Flink概念

Tasks and Operator Chains(階段劃分)

對Flink分佈式執行,Flink嘗試根據任務計算並行度,將若干個操作符連接成一個任務Task(階段-stage),一個Flink的計算任務通常會被拆分成若干Task,每一個Task都有自己任務並行度,每個並行度表示一個線程-subtask.

在這裏插入圖片描述

  • Task 等價於Spark任務中Stage
  • OPerator Chain Flink通過Operator Chain方式實現Task劃分,有點類似Spark寬窄依賴。Operator Chain方式有兩種

forward、hash|rebalance

Job Managers, Task Managers, Clients

JobManagers(Master) :協調並行計算任務。負責調度Tasks、協調checkpoint以及故障恢復,等價Spark Master+Driver

There is always at least one Job Manager. A high-availability setup will have multiple JobManagers, one of which one is always the leader, and the others are standby.

TaskManagers(Slaves):真正負責Task執行節點(執行subtask|線程),同時需要向JobManagers彙報節點狀態以及工作負荷。

client:和Spark不同,Client並不是集羣計算的一部分,只負責任務提交== dataflow ==(類似Spark DAG圖)給JobManager。提交完成後可以退出。與spark的client稱爲Driver,負責生產DAG並且監控整個任務的執行和故障恢復。在這裏插入圖片描述

Task Slots and Resources

每個Worker(TaskManager)是一個JVM進程,可以執行一個或多個子任務(Thread|subtask)。爲了控制woker接受多少個任務,Woker具有所謂的Task Slot(至少一個task slot)。

每個Task Slot代表TaskManager資源的固定子集。例如,具有3個slot的TaskManager則每個slot表示佔用當前TaskManager進程的1/3的內存。每個Job在啓動的時候都有自己的TaskSlots-數目是固定的,這樣通過slot劃分就可以避免不同job的subtask之間競爭內存資源。

以下表示一個Job獲取6個slot,但是僅僅只有5個線程,3個task .

在這裏插入圖片描述
默認來自同一個job的不同task(階段)的subtask可以共享task slot。默認情況下Flink中job計算所需的slots的個數是由Task中最大並行度所決定。

  • Flink集羣所需的任務槽與作業中使用的最高並行度恰好一樣多。
  • 更容易獲得更好的資源利用率。如果沒有插槽共享,則非密集型source / map()子任務將阻塞與資源密集型window子任務一樣多的資源。通過slot共享可以講任務並行度由2增加到6,可以得到如下資源分配。在這裏插入圖片描述
  • 更多參考:https://ci.apache.org/projects/flink/flink-docs-release-1.9/concepts/runtime.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章