Flink/Blink 原理漫談(零)運行時的組件

系列文章目錄

Flink/Blink 原理漫談(零)運行時的組件

Flink/Blink 原理漫談(一)時間,watermark詳解

Flink/Blink 原理漫談(二)流表對偶性和distinct詳解

Flink/Blink 原理漫談(三)state 有狀態計算機制 詳解

Flink/Blink 原理漫談(四)window機制詳解

Flink/Blink 原理漫談(五)流式計算的持續查詢實現 詳解

Flink/Blink 原理漫談(六)容錯機制(fault tolerance)詳解



前言 談談blink和flink

在實習時候接觸到了flink,這玩意實現了大促期間的實時大數據更新,這對我們這種只寫過python,c++啥玩意的來說聞所未聞,所以瞭解了一下flink的原理,並且嘗試使用了公司的blink,在學習時間之餘,整理了所有的學習筆記,目的也是分享學習。
在這裏插入圖片描述

Apache Flink 是一個框架和分佈式處理引擎,用於對無界和有界數據流進行有 狀態計算。Flink 被設計在所有常見的集羣環境中運行,以內存執行速度和任意規模 來執行計算。

Blink是阿里巴巴實時計算部通過改進開源Apache Flink項目而創建的阿里內部產品。簡單的說Blink就是阿里巴巴開發的Flink 企業版。

這倆東西最大的不同其實我感覺,就是blink在公司應用起來是一個十分上層的api,語法基本都是sql,只需要加上with後面的參數就可以實現很多流式計算的功能,使用起來十分方便,即使有些複雜功能不好用sql直接實現也可以使用udf補充實現;而flink使用更多的是datastream api,還是要用java寫的,一些函數的使用需要去一步一步熟悉,相對來說,還是複雜了很多,其實flink也有sql api,但是功能不完善,很離譜,我竟然在完全開發完成之前就已經在學習了。總之,blink雖好,但是是人家內部用,flink也好,但是使用也是略微門檻要高一丟丟,我看到阿里雲好像有flink,那個版本的應該也可以使用最上層的api,這個就不是特別瞭解了。


Blink原理漫談

這部分內容來自blink漫談系列ata,以及網絡中關於flink原理的講解和一些知識分享視頻。我認爲想要理解flink原理,可以先嚐試從頭到尾閱讀一下《blink漫談》,大概是有十篇左右,這部分其實講的很好,但是如果有點糊塗,那還是和我一樣……拿着一本書先啃吧,看完一本介紹flink的書,再看這一部分,就感覺很好理解了。話不多說,我嘗試用簡單的語言講一下blink/flink的比較重要的實現原理。

零、 Flink運行時的組件

Flink 運行時架構主要包括四個不同的組件,它們會在運行流處理應用程序時協同工作: 作業管理器(JobManager)、資源管理器(ResourceManager)、任務管理器(TaskManager), 以及分發器(Dispatcher)。因爲 Flink 是用 Java 和 Scala 實現的,所以所有組件都會運行在 Java 虛擬機上。
下圖是整個flink的架構
在這裏插入圖片描述

JobManager

控制一個應用程序的主進程
接受要制定的應用程序:作業圖(JobGraph),邏輯數據流圖(Logic dataflow graph),打包了的jar包
JobManager將JobGraph轉換成一個物理層面的數據流圖(執行圖execution Graph),包含所有可併發執行的任務。
在這裏插入圖片描述


TaskManager

Flink中的工作進程,通常會有多個TaskManager運行。
每個TaskManager中含一定量slot
TaskManger會向ResourceManager中註冊它的插槽
TaskManager收到ResourceManager的指令後,會將slot供JobManager調用(JobManager流程圖的第二步的後續)
JobManager可向slot分配任務來執行
運行同一任務的TaskManager可相互交換數據




TaskManager與JobManager的關係如圖
在這裏插入圖片描述

ResourceManager

負責管理TaskManager的slot
不同環境有不同的ResourceManager

Dispatcher

爲應用提供了REST接口,啓動web,ui,展示監控作業的執行信息
應用被提交執行->Dispatcher啓動->將應用移交給一個JobManager

任務提交流程

在這裏插入圖片描述
TaskManger和slot
Flink 中每一個 worker(TaskManager)都是一個 JVM 進程,它可能會在獨立的線 程上執行一個或多個 subtask。爲了控制一個 worker 能接收多少個 task,worker 通 過 task slot 來進行控制(一個 worker 至少有一個 task slot)。 每個 task slot 表示 TaskManager 擁有資源的一個固定大小的子集。假如一個 TaskManager 有三個 slot,那麼它會將其管理的內存分成三份給各個slot。
通過調整 task slot 的數量,允許用戶定義 subtask 之間如何互相隔離。如果一個 TaskManager 一個 slot,那將意味着每個 task group 運行在獨立的 JVM 中(該 JVM 可能是通過一個特定的容器啓動的),而一個 TaskManager 多個 slot 意味着更多的 subtask 可以共享同一個 JVM。而在同一個 JVM 進程中的 task 將共享 TCP 連接(基 於多路複用)和心跳消息。它們也可能共享數據集和數據結構,因此這減少了每個 task 的負載。


Task Slot 是靜態的概念,是指 TaskManager 具有的併發執行能力,可以通過 參數 taskmanager.numberOfTaskSlots 進行配置;而並行度 parallelism 是動態概念, 即 TaskManager 運行程序時實際使用的併發能力,可以通過參數 parallelism.default 進行配置。 也就是說,假設一共有 3個 TaskManager,每一個 TaskManager 中的分配 3個 TaskSlot,也就是每個 TaskManager 可以接收 3個 task,一共 9個 TaskSlot,如果我 們設置 parallelism.default=1,即運行程序默認的並行度爲 1,9個 TaskSlot 只用了 1個,有 8個空閒,因此,設置合適的並行度才能提高效率

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