1. 程式人生 > >精通flink讀書筆記(1)

精通flink讀書筆記(1)

很多人已經用上了spark,所以人們往往有個疑問,問啥還要用flink呢? 首先我們理解flink是基於流處理,是一個真正的流處理引擎,不是一個基於微批處理的引擎。批處理在flink看來反而是一種特殊情況。 下圖是flink的結構
flink是一個分層的體系結構。flink可以執行在本地,也可以執行在yarn或者是雲主機上。Runtime是flink的核心資料處理引擎,它通過JobGraph的api來接受任務。 JobGraph是一個任務集合,該集合可以產生和消費資料流。 DataStream和DateSet是用來定義Job的介面。JobGrahp就是通過DataStream和DataSet來產生的。當任務提交完後,DataSet也會產生一個優化器來產生一個執行計劃,DataStream也會產生一個流的優化執行器。 已經優化過的JobGraph會通過yarn或者local等模式向executor提交。 flink也有分散式結構: flink的分散式結構包含兩個元件:master和worker  ,當任務提交後,會有如下幾個角色:Job Mangager  ,Task Manager ,Job Client

flink 的專案要向Job Client提交,JobClient 接著會向Job Manager提交任務,Job Manager的工作就是資源分配和任務排程。它的首要任務就是看需要多少資源,如果資源足夠,就會把任務提交給Task Manager,Task Manager初始化執行緒開啟任務,並向Job Manager報告執行情況,一旦工作執行完畢,結果會向client彙集。 JobManager master 也被稱作JobManager,用於協同和管理程式專案的execution,排程任務,管理checkpoint,任務重啟等等 master也有主備機制。 JobManager包括一下幾個部分:Actor system,scheduler,checkpoint
Flink是用Akka作為JobManager和Task Manager之間的通訊。 Actor System actor system是一個各種任務角色的actor容器系統。它提供任務排程,配置,日誌,執行緒池等等。而且每個actor相互通訊通過郵箱,如果是在本地模式下,通訊的資訊是儲存在共享記憶體中,如果是actors是在遠端,則通過RPC來通訊。 在actor system中的actors都是分層分佈的 actor有它的父actor,父actor是子actor的監管者,如果子actor出現錯誤了就去解決,如果父actor自己解決不了,就會向它自己的父actor傳遞資訊。
在flink中,一個actor是一個含有狀態和行為的容器,它的狀態和行為是受它接受到的資訊所決定的。 scheduler
在flink中,executors 被看做task slot,每一個task manager可以管理一個或多個task slot,一個任務被放到一個共享的slot中還是一個特定slot中,是通過slotSharingGroup 和CoLocationGroup定義的。 Check Point checkpoint是個snapshot,通常資料的狀態資訊是存放在一個配置好的地方,如hdfs,萬一失敗了,flink停止executor並重新從最新的checkpoint開始 而Stream barriers是snapshot的核心要素。barriers被輸入到流中,但是不會影響流,barriers會把一組訊息合成一個snapshot,而且每個barrier有一個唯一的id。如下圖
每個snapshot的狀態會上報到jobmanager的checkpoint協調器。同時要記錄下這個snapshot,Flink要對齊記錄是為了在重啟服務時能避免重新處理同樣的資料。 對齊的操作通常會消耗幾毫秒。如果對實時性要求極高,可以關閉這個功能。 Task manager task manager是一個worker節點,用於執行操作JVM裡的tasks。並行的task執行靠的是task slots。如果task manager有4個task slot,則每個task slot會要求25%的記憶體資源。多個執行緒在處理同一個slot的任務中會共享JVM,同一個slot中的task也會共享TCP連線和心跳通訊。 Job Client job client並不是flink的一部分,但是確實執行的起點。 val text = env.readTextFile("input.txt")   val counts = text.flatMap{_.toLowerCase.split("\\W+") filter {_.nonEmpty}}                  .map{(_,1)}
                 .groupBy(0)
                 .sum(1)
counts.writeAsCsv("output.txt","\n"," ") job Client 會把客戶提交的上述程式碼轉化為data flow.data flow預設是並行和分散式的。資料流會以one-to-one 或者是  re-distributed的方式來做。