Flink系列文章
第01講:Flink 的應用場景和架構模型
第02講:Flink 入門程序 WordCount 和 SQL 實現
第03講:Flink 的編程模型與其他框架比較
你好,歡迎來到第 01 課時,本課時我們主要介紹 Flink 的應用場景和架構模型。
實時計算最好的時代
在過去的十年里,面向數據時代的實時計算技術接踵而至。從我們最初認識的 Storm,再到 Spark 的異軍突起,迅速占領了整個實時計算領域。直到 2019 年 1 月底,阿里巴巴內部版本 Flink 正式開源!一石激起千層浪,Flink 開源的消息立刻刷爆朋友圈,整個大數據計算領域一直以來由 Spark 獨領風騷,瞬間成為兩強爭霸的時代。
Apache Flink(以下簡稱 Flink)以其先進的設計理念、強大的計算能力備受關注,如何將 Flink 快速應用在生產環境中,更好的與現有的大數據生態技術完美結合,充分挖掘數據的潛力,成為了眾多開發者面臨的難題。
Flink 實際應用場景
Flink 自從 2019 年初開源以來,迅速成為大數據實時計算領域炙手可熱的技術框架。作為 Flink 的主要貢獻者阿里巴巴率先將其在全集團進行推廣使用,另外由於 Flink 天然的流式特性,更為領先的架構設計,使得 Flink 一出現便在各大公司掀起了應用的熱潮。
阿里巴巴、騰訊、百度、字節跳動、滴滴、華為等眾多互聯網公司已經將 Flink 作為未來技術重要的發力點,迫切地在各自公司內部進行技術升級和推廣使用。同時,Flink 已經成為 Apache 基金會和 GitHub 社區最為活躍的項目之一。
我們來看看 Flink 支持的眾多應用場景。
實時數據計算
如果你對大數據技術有所接觸,那么下面的這些需求場景你應該並不陌生:
阿里巴巴每年雙十一都會直播,實時監控大屏是如何做到的?
公司想看一下大促中銷量最好的商品 TOP5?
我是公司的運維,希望能實時接收到服務器的負載情況?
......
我們可以看到,數據計算場景需要從原始數據中提取有價值的信息和指標,比如上面提到的實時銷售額、銷量的 TOP5,以及服務器的負載情況等。
傳統的分析方式通常是利用批查詢,或將事件(生產上一般是消息)記錄下來並基於此形成有限數據集(表)構建應用來完成。為了得到最新數據的計算結果,必須先將它們寫入表中並重新執行 SQL 查詢,然后將結果寫入存儲系統比如 MySQL 中,再生成報告。
Apache Flink 同時支持流式及批量分析應用,這就是我們所說的批流一體。Flink 在上述的需求場景中承擔了數據的實時采集、實時計算和下游發送。
實時數據倉庫和 ETL
ETL(Extract-Transform-Load)的目的是將業務系統的數據經過抽取、清洗轉換之后加載到數據倉庫的過程。
傳統的離線數據倉庫將業務數據集中進行存儲后,以固定的計算邏輯定時進行 ETL 和其他建模后產出報表等應用。離線數據倉庫主要是構建 T+1 的離線數據,通過定時任務每天拉取增量數據,然后創建各個業務相關的主題維度數據,對外提供 T+1 的數據查詢接口。
上圖展示了離線數據倉庫 ETL 和實時數據倉庫的差異,可以看到離線數據倉庫的計算和數據的實時性均較差。數據本身的價值隨着時間的流逝會逐步減弱,因此數據發生后必須盡快的達到用戶的手中,實時數倉的構建需求也應運而生。
實時數據倉庫的建設是“數據智能 BI”必不可少的一環,也是大規模數據應用中必然面臨的挑戰。
Flink 在實時數倉和實時 ETL 中有天然的優勢:
- 狀態管理,實時數倉里面會進行很多的聚合計算,這些都需要對於狀態進行訪問和管理,Flink 支持強大的狀態管理;
- 豐富的 API,Flink 提供極為豐富的多層次 API,包括 Stream API、Table API 及 Flink SQL;
- 生態完善,實時數倉的用途廣泛,Flink 支持多種存儲(HDFS、ES 等);
- 批流一體,Flink 已經在將流計算和批計算的 API 進行統一。
事件驅動型應用
你是否有這樣的需求:
我們公司有幾萬台服務器,希望能從服務器上報的消息中將 CPU、MEM、LOAD 信息分離出來做分析,然后觸發自定義的規則進行報警?
我是公司的安全運維人員,希望能從每天的訪問日志中識別爬蟲程序,並且進行 IP 限制?
......
事件驅動型應用是一類具有狀態的應用,它從一個或多個事件流提取數據,並根據到來的事件觸發計算、狀態更新或其他外部動作。
在傳統架構中,我們需要讀寫遠程事務型數據庫,比如 MySQL。在事件驅動應用中數據和計算不會分離,應用只需訪問本地(內存或磁盤)即可獲取數據,所以具有更高的吞吐和更低的延遲。
Flink 的以下特性完美的支持了事件驅動型應用:
- 高效的狀態管理,Flink 自帶的 State Backend 可以很好的存儲中間狀態信息;
- 豐富的窗口支持,Flink 支持包含滾動窗口、滑動窗口及其他窗口;
- 多種時間語義,Flink 支持 Event Time、Processing Time 和 Ingestion Time;
- 不同級別的容錯,Flink 支持 At Least Once 或 Exactly Once 容錯級別。
小結
Apache Flink 從底層支持了針對多種不同場景的應用開發。
Flink 的主要特性包括:批流一體、Exactly-Once、強大的狀態管理等。同時,Flink 還支持運行在包括 YARN、 Mesos、Kubernetes 在內的多種資源管理框架上。阿里巴巴已經率先將 Flink 在全集團進行推廣使用,事實證明,Flink 已經可以擴展到數千核心,其狀態可以達到 TB 級別,且仍能保持高吞吐、低延遲的特性。
因此,Flink 已經成為我們在實時計算的領域的第一選擇。
Flink 的架構模型
Flink 的分層模型
Flink 自身提供了不同級別的抽象來支持我們開發流式或者批量處理程序,上圖描述了 Flink 支持的 4 種不同級別的抽象。
對於我們開發者來說,大多數應用程序不需要上圖中的最低級別的 Low-level 抽象,而是針對 Core API 編程, 比如 DataStream API(有界/無界流)和 DataSet API (有界數據集)。這些流暢的 API 提供了用於數據處理的通用構建塊,比如各種形式用戶指定的轉換、連接、聚合、窗口、狀態等。
Table API 和 SQL 是 Flink 提供的更為高級的 API 操作,Flink SQL 是 Flink 實時計算為簡化計算模型,降低用戶使用實時計算門檻而設計的一套符合標准 SQL 語義的開發語言。
Flink 的數據流模型
Flink 程序的基礎構建模塊是流(Streams)與轉換(Transformations),每一個數據流起始於一個或多個 Source,並終止於一個或多個 Sink。數據流類似於有向無環圖(DAG)。
我們以一個最經典的 WordCount 計數程序舉例:
在上圖中,程序消費 Kafka 數據,這便是我們的 Source 部分。
然后經過 Map、Keyby、TimeWindow 等方法進行邏輯計算,該部分就是我們的 Transformation 轉換部分,而其中的 Map、Keyby、TimeWindow 等方法被稱為算子。通常,程序中的轉換與數據流中的算子之間存在對應關系,有時一個轉換可能包含多個轉換算子。
最后,經過計算的數據會被寫入到我們執行的文件中,這便是我們的 Sink 部分。
實際上面對復雜的生產環境,Flink 任務大都是並行進行和分布在各個計算節點上。在 Flink 任務執行期間,每一個數據流都會有多個分區,並且每個算子都有多個算子任務並行進行。算子子任務的數量是該特定算子的並行度****(Parallelism),對並行度的設置是 Flink 任務進行調優的重要手段,我們會在后面的課程中詳細講解。
從上圖中可以看到,在上面的 map 和 keyBy/window 之間,以及 keyBy/window 和 Sink 之間,因為並行度的差異,數據流都進行了重新分配。
Flink 中的窗口和時間
窗口和時間是 Flink 中的核心概念之一。在實際成產環境中,對數據流上的聚合需要由窗口來划定范圍,比如“計算過去的 5 分鍾”或者“最后 100 個元素的和”。
Flink 支持了多種窗口模型比如滾動窗口(Tumbling Window)、滑動窗口(Sliding Window)及會話窗口(Session Window)等。
下圖展示了 Flink 支持的多種窗口模型:
同時,Flink 支持了事件時間(Event Time)、攝取時間(Ingestion Time)和處理時間(Processing Time)三種時間語義用來滿足實際生產中對於時間的特殊需求。
其他
此外,Flink 自身還支持了有狀態的算子操作、容錯機制、Checkpoint、Exactly-once 語義等更多高級特性,來支持用戶在不同的業務場景中的需求。
總結
本課時從實時計算的背景入手介紹了當前實時計算的發展歷程,Flink 作為實時計算領域的一匹黑馬,先進的設計思想、強大的性能和豐富的業務場景支持,已經是我們開發者必須要學習的技能之一,Flink 已經成為實時計算領域最鋒利的武器!
關注公眾號:
大數據技術派
,回復資料
,領取1024G
資料。