第一次有人把Apache Flink說的這麼明白!
Apache Flink(以下簡稱Flink)專案是大資料處理領域最近冉冉升起的一顆新星,其不同於其他大資料專案的諸多特性吸引了越來越多人的關注。本文將深入分析Flink的一些關鍵技術與特性,希望能夠幫助讀者對Flink有更加深入的瞭解,對其他大資料系統開發者也能有所裨益。本文假設讀者已對MapReduce、Spark及Storm等大資料處理框架有所瞭解,同時熟悉流處理與批處理的基本概念。
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及多種圖計算演算法實現。
這裡向大家推薦一個大資料交流圈q裙:894951460。
為什麼我會接觸到 Flink 呢?因為我目前在負責的是監控平臺的告警部分,負責採集到的監控資料會直接往 kafka 裡塞,然後告警這邊需要從 kafka topic 裡面實時讀取到監控資料,並將讀取到的監控資料做一些 聚合/轉換/計算 等操作,然後將計算後的結果與告警規則的閾值進行比較,然後做出相應的告警措施(釘釘群、郵件、簡訊、電話等)。畫了個簡單的圖如下:

為什麼選擇 Flink?
Flink 是一個開源的分散式流式處理框架:
①提供準確的結果,甚至在出現無序或者延遲載入的資料的情況下。
②它是狀態化的容錯的,同時在維護一次完整的的應用狀態時,能無縫修復錯誤。
③大規模執行,在上千個節點執行時有很好的吞吐量和低延遲。
更早的時候,我們討論了資料集型別(有界 vs 無窮)和運算模型(批處理 vs 流式)的匹配。Flink 的流式計算模型啟用了很多功能特性,如狀態管理,處理無序資料,靈活的視窗,這些功能對於得出無窮資料集的精確結果是很重要的。
除了提供資料驅動的視窗外,Flink還支援基於時間,計數,session等的靈活視窗。視窗能夠靈活的觸發條件定製化從而達到對複雜的流傳輸模式的支援。Flink的視窗使得模擬真實的建立資料的環境成為可能。

Flink的容錯能力事輕量級的,允許系統提供高併發,同時在同一時間提供強一致性保證。Flink以零資料丟失的方式從故障中恢復,但沒有考慮可靠性和延遲之間的折中。
Flink可以滿足高併發和低延遲(計算大量資料很快)。下圖顯示了Apache Flink與Apache Storm在完成流資料清晰的分散式的效能對比

Flink儲存點提供了一個狀態化的版本機制,使得能以無丟失狀態和最短時間的停機方式更新應用和回退歷史資料。

Flink被設計成用上千個點在大規模叢集上執行。除了支援獨立叢集部署外,Flink還支援YARN和Me'sos方式部署。
Flink的程式內在事並行和分散式的,資料流可以被分割槽成stram partitions,operators被劃分為operator subtasks;這些subtasks在不同的機器火容器中分不同的西城獨立執行;operator subtasks的數量在具體的operator就是平行計算數,程式不同的operator 階段可能有不同的並行數;如下圖所示,source operator 的並行書為2,但是最後的sink operator 為1;

分散式執行
flink 作業提交架構流程可見下圖:

1、Program Code:我們編寫的 Flink 應用程式程式碼
2、Job Client:Job Client 不是 Flink 程式執行的內部部分,但它是任務執行的起點。 Job Client 負責接受使用者的程式程式碼,然後建立資料流,將資料流提交給 Job Manager 以便進一步執行。 執行完成後,Job Client 將結果返回給使用者

、Job Manager:主程序(也稱為作業管理器)協調和管理程式的執行。 它的主要職責包括安排任務,管理checkpoint ,故障恢復等。機器叢集中至少要有一個 master,master 負責排程 task,協調 checkpoints 和容災,高可用設定的話可以有多個 master,但要保證一個是 leader, 其他是 standby; Job Manager 包含 Actor system、Scheduler、Check pointing 三個重要的元件
4、Task Manager:從 Job Manager 處接收需要部署的 Task。Task Manager 是在 JVM 中的一個或多個執行緒中執行任務的工作節點。 任務執行的並行性由每個 Task Manager 上可用的任務槽決定。 每個任務代表分配給任務槽的一組資源。 例如,如果 Task Manager 有四個插槽,那麼它將為每個插槽分配 25% 的記憶體。 可以在任務槽中執行一個或多個執行緒。 同一插槽中的執行緒共享相同的 JVM。 同一 JVM 中的任務共享 TCP 連線和心跳訊息。Task Manager 的一個 Slot 代表一個可用執行緒,該執行緒具有固定的記憶體,注意 Slot 只對記憶體隔離,沒有對 CPU 隔離。預設情況下,Flink 允許子任務共享 Slot,即使它們是不同 task 的 subtask,只要它們來自相同的 job。這種共享可以有更好的資源利用率。

結語
感謝您的觀看,如有不足之處,歡迎批評指正。
獲取資料
本次給大家推薦一個免費的學習群,裡面概括資料倉庫/原始碼解析/Python/Hadoop/Flink/Spark/Storm/Hive以及面試資源等。
對大資料開發技術感興趣的同學,歡迎加入Q群: 894951460 ,不管你是小白還是大牛我都歡迎,還有大牛整理的一套高效率學習路線和教程與您免費分享,同時每天更新視訊資料。
最後,祝大家早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峰。