原文連結:一文弄懂Flink基礎理論
Flink分布式程式包含2個主要的程序:JobManager和TaskManager.當程式運作時,不同的程序就會參與其中,包括Jobmanager、TaskManager和JobClient。
當 Flink 叢集啟動後,首先會啟動一個 JobManger 和一個或多個的 TaskManager。由 Client 送出任務給 JobManager,JobManager 再排程任務到各個 TaskManager 去執行,然後 TaskManager 将心跳和統計資訊彙報給 JobManager。TaskManager 之間以流的形式進行資料的傳輸。上述三者均為獨立的 JVM 程序。
JobManager
Master程序,負責Job的管理和資源的協調。包括任務排程,檢查點管理,失敗恢複等。
當然,對于叢集HA模式,可以同時多個master程序,其中一個作為leader,其他作為standby。當leader失敗時,會選出一個standby的master作為新的leader(通過zookeeper實作leader選舉)。
JobManager包含了3個重要的元件:
###(1)Actor系統
Flink内部使用Akka模型作為JobManager和TaskManager之間的通信機制。
Actor系統是個容器,包含許多不同的Actor,這些Actor扮演者不同的角色。Actor系統提供類似于排程、配置、日志等服務,同時包含了所有actors初始化時的線程池。
所有的Actors存在着層級的關系。新加入的Actor會被配置設定一個父類的Actor。Actors之間的通信采用一個消息系統,每個Actor都有一個“郵箱”,用于讀取消息。如果Actors是本地的,則消息在共享記憶體中共享;如果Actors是遠端的,則消息通過RPC遠端調用。
每個父類的Actor都負責監控其子類Actor,當子類Actor出現錯誤時,自己先嘗試重新開機并修複錯誤;如果子類Actor不能修複,則将問題更新并由父類Actor處理。
在Flink中,actor是一個有狀态和行為的容器。Actor的線程持續的處理從“郵箱”中接收到的消息。Actor中的狀态和行為則由收到的消息決定。
###(2)排程
Flink中的Executors被定義為task slots(線程槽位)。每個Task Manager需要管理一個或多個task slots。
Flink通過SlotSharingGroup和CoLocationGroup來決定哪些task需要被共享,哪些task需要被單獨的slot使用。
###(3)檢查點
Flink的檢查點機制是保證其一緻性容錯功能的骨架。它持續的為分布式的資料流和有狀态的operator生成一緻性的快照。Flink的容錯機制持續的建構輕量級的分布式快照,是以負載非常低。通常這些有狀态的快照都被放在HDFS中存儲(state backend)。程式一旦失敗,Flink将停止executor并從最近的完成了的檢查點開始恢複(依賴可重發的資料源+快照)。
參考:三分鐘掌握Flink基本概念和原理
運作架構
常用的類型和操作
參考:
Flink 原理與實作:資料流上的類型和操作:http://wuchong.me/blog/2016/05/20/flink-internals-streams-and-operations-on-streams
Flink Stream 算子:https://flink.sojb.cn/dev/stream/operators
程式結構介紹
Source,它是整個stream的入口。
Transformation,用于轉換一個或多個DataStream進而形成一個新的DataStream對象。
Sink,它流的資料出口。
并行資料流
Flink程式本質上是并行和分布式的。在程式執行期間,一個流會生成一個或者多個stream partition,并且一個operator會生成一個或者多個operator subtask。operator的 subtask 彼此之間是獨立的,分别在不同的線程裡去執行并且可能分布在不同的機器上或者containers上。
operator的subtasks的數量等于該操作算子的并行度的數量。流的并行度有總是取決于産生它的操作算子的并行度決定的。同一個flink程式中的不同的operators可能有不同的并行度。
資料流在兩個operators之間進行傳遞的方式有兩種:one-to-one 模式 和 redistributing 模式
- one-to-one 模式
兩個operator用此模式傳遞的時候,會保持資料的分區數和資料的排序,比如:在下圖中Source和map() operators之間的資料傳遞方式;
- Redistributing 模式(重新配置設定模式)
這種模式會改變資料的分區數;每個一個operator subtask會根據選擇transformation把資料發送到不同的目标subtasks,比如keyBy()會通過hashcode重新分區,broadcast()和rebalance()方法會随機重新分區,比如:在下圖中map()和keyBy/window ,keyBy/window和Sink之間的資料傳遞方式;
Flink每個算子都可以設定并行度,然後就是也可以設定全局并行度。
api設定.map(new RollingAdditionMapper()).setParallelism(10)
全局配置在flink-conf.yaml檔案中,parallelism.default,預設是1
Task and Operator Chains
為了更高效地分布式執行,Flink會盡可能地将operator的subtask連結(chain)在一起形成task。每個task在一個線程中執行。将operators連結成task是非常有效的優化:它能減少線程之間的切換,減少消息的序列化/反序列化,減少資料在緩沖區的交換,減少了延遲的同時提高整體的吞吐量。
可以進行Operator chains的條件
1、上下遊的并行度一緻
2、下遊節點的入度為1 (也就是說下遊節點沒有來自其他節點的輸入)
3、上下遊節點都在同一個 slot group 中(下面會解釋 slot group)
4、下遊節點的 chain 政策為 ALWAYS(可以與上下遊連結,map、flatmap、filter等預設是ALWAYS)
5、上遊節點的 chain 政策為 ALWAYS 或 HEAD(隻能與下遊連結,不能與上遊連結,Source預設是HEAD)
6、兩個節點間資料分區方式是 forward(參考了解資料流的分區)
7、使用者沒有禁用 chain
————————————————