第01講:Flink 的應用場景和架構模型


Flink系列文章

第01講:Flink 的應用場景和架構模型
第02講:Flink 入門程序 WordCount 和 SQL 實現
第03講:Flink 的編程模型與其他框架比較

你好,歡迎來到第 01 課時,本課時我們主要介紹 Flink 的應用場景和架構模型。

實時計算最好的時代

在過去的十年里,面向數據時代的實時計算技術接踵而至。從我們最初認識的 Storm,再到 Spark 的異軍突起,迅速占領了整個實時計算領域。直到 2019 年 1 月底,阿里巴巴內部版本 Flink 正式開源!一石激起千層浪,Flink 開源的消息立刻刷爆朋友圈,整個大數據計算領域一直以來由 Spark 獨領風騷,瞬間成為兩強爭霸的時代。

Apache Flink(以下簡稱 Flink)以其先進的設計理念、強大的計算能力備受關注,如何將 Flink 快速應用在生產環境中,更好的與現有的大數據生態技術完美結合,充分挖掘數據的潛力,成為了眾多開發者面臨的難題。

Flink 自從 2019 年初開源以來,迅速成為大數據實時計算領域炙手可熱的技術框架。作為 Flink 的主要貢獻者阿里巴巴率先將其在全集團進行推廣使用,另外由於 Flink 天然的流式特性,更為領先的架構設計,使得 Flink 一出現便在各大公司掀起了應用的熱潮。

阿里巴巴、騰訊、百度、字節跳動、滴滴、華為等眾多互聯網公司已經將 Flink 作為未來技術重要的發力點,迫切地在各自公司內部進行技術升級和推廣使用。同時,Flink 已經成為 Apache 基金會和 GitHub 社區最為活躍的項目之一

我們來看看 Flink 支持的眾多應用場景。

實時數據計算

如果你對大數據技術有所接觸,那么下面的這些需求場景你應該並不陌生:

阿里巴巴每年雙十一都會直播,實時監控大屏是如何做到的?

公司想看一下大促中銷量最好的商品 TOP5?

我是公司的運維,希望能實時接收到服務器的負載情況?

......

img

我們可以看到,數據計算場景需要從原始數據中提取有價值的信息和指標,比如上面提到的實時銷售額、銷量的 TOP5,以及服務器的負載情況等。

傳統的分析方式通常是利用批查詢,或將事件(生產上一般是消息)記錄下來並基於此形成有限數據集(表)構建應用來完成。為了得到最新數據的計算結果,必須先將它們寫入表中並重新執行 SQL 查詢,然后將結果寫入存儲系統比如 MySQL 中,再生成報告。

Apache Flink 同時支持流式及批量分析應用,這就是我們所說的批流一體。Flink 在上述的需求場景中承擔了數據的實時采集實時計算下游發送

實時數據倉庫和 ETL

ETL(Extract-Transform-Load)的目的是將業務系統的數據經過抽取、清洗轉換之后加載到數據倉庫的過程。

img

傳統的離線數據倉庫將業務數據集中進行存儲后,以固定的計算邏輯定時進行 ETL 和其他建模后產出報表等應用。離線數據倉庫主要是構建 T+1 的離線數據,通過定時任務每天拉取增量數據,然后創建各個業務相關的主題維度數據,對外提供 T+1 的數據查詢接口。

上圖展示了離線數據倉庫 ETL 和實時數據倉庫的差異,可以看到離線數據倉庫的計算和數據的實時性均較差。數據本身的價值隨着時間的流逝會逐步減弱,因此數據發生后必須盡快的達到用戶的手中,實時數倉的構建需求也應運而生。

實時數據倉庫的建設是“數據智能 BI”必不可少的一環,也是大規模數據應用中必然面臨的挑戰。

Flink 在實時數倉和實時 ETL 中有天然的優勢:

  • 狀態管理,實時數倉里面會進行很多的聚合計算,這些都需要對於狀態進行訪問和管理,Flink 支持強大的狀態管理;
  • 豐富的 API,Flink 提供極為豐富的多層次 API,包括 Stream API、Table API 及 Flink SQL;
  • 生態完善,實時數倉的用途廣泛,Flink 支持多種存儲(HDFS、ES 等);
  • 批流一體,Flink 已經在將流計算和批計算的 API 進行統一。

img

事件驅動型應用

你是否有這樣的需求:

我們公司有幾萬台服務器,希望能從服務器上報的消息中將 CPU、MEM、LOAD 信息分離出來做分析,然后觸發自定義的規則進行報警?

我是公司的安全運維人員,希望能從每天的訪問日志中識別爬蟲程序,並且進行 IP 限制?

......

事件驅動型應用是一類具有狀態的應用,它從一個或多個事件流提取數據,並根據到來的事件觸發計算、狀態更新或其他外部動作。

在傳統架構中,我們需要讀寫遠程事務型數據庫,比如 MySQL。在事件驅動應用中數據和計算不會分離,應用只需訪問本地(內存或磁盤)即可獲取數據,所以具有更高的吞吐和更低的延遲。

img

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 已經成為我們在實時計算的領域的第一選擇

img

Flink 自身提供了不同級別的抽象來支持我們開發流式或者批量處理程序,上圖描述了 Flink 支持的 4 種不同級別的抽象。

對於我們開發者來說,大多數應用程序不需要上圖中的最低級別的 Low-level 抽象,而是針對 Core API 編程, 比如 DataStream API(有界/無界流)和 DataSet API (有界數據集)。這些流暢的 API 提供了用於數據處理的通用構建塊,比如各種形式用戶指定的轉換、連接、聚合、窗口、狀態等。

Table API 和 SQL 是 Flink 提供的更為高級的 API 操作,Flink SQL 是 Flink 實時計算為簡化計算模型,降低用戶使用實時計算門檻而設計的一套符合標准 SQL 語義的開發語言。

Flink 程序的基礎構建模塊是(Streams)與轉換(Transformations),每一個數據流起始於一個或多個 Source,並終止於一個或多個 Sink。數據流類似於有向無環圖(DAG)。

我們以一個最經典的 WordCount 計數程序舉例:

img

在上圖中,程序消費 Kafka 數據,這便是我們的 Source 部分。

然后經過 Map、Keyby、TimeWindow 等方法進行邏輯計算,該部分就是我們的 Transformation 轉換部分,而其中的 Map、Keyby、TimeWindow 等方法被稱為算子。通常,程序中的轉換與數據流中的算子之間存在對應關系,有時一個轉換可能包含多個轉換算子。

最后,經過計算的數據會被寫入到我們執行的文件中,這便是我們的 Sink 部分。

實際上面對復雜的生產環境,Flink 任務大都是並行進行和分布在各個計算節點上。在 Flink 任務執行期間,每一個數據流都會有多個分區,並且每個算子都有多個算子任務並行進行。算子子任務的數量是該特定算子的並行度****(Parallelism),對並行度的設置是 Flink 任務進行調優的重要手段,我們會在后面的課程中詳細講解。

img

從上圖中可以看到,在上面的 map 和 keyBy/window 之間,以及 keyBy/window 和 Sink 之間,因為並行度的差異,數據流都進行了重新分配。

窗口時間是 Flink 中的核心概念之一。在實際成產環境中,對數據流上的聚合需要由窗口來划定范圍,比如“計算過去的 5 分鍾”或者“最后 100 個元素的和”。

Flink 支持了多種窗口模型比如滾動窗口(Tumbling Window)、滑動窗口(Sliding Window)會話窗口(Session Window)等。

下圖展示了 Flink 支持的多種窗口模型:

img

同時,Flink 支持了事件時間(Event Time)攝取時間(Ingestion Time)處理時間(Processing Time)三種時間語義用來滿足實際生產中對於時間的特殊需求。

img

其他

此外,Flink 自身還支持了有狀態的算子操作、容錯機制、Checkpoint、Exactly-once 語義等更多高級特性,來支持用戶在不同的業務場景中的需求。

點擊這里下載本課程源碼

總結

本課時從實時計算的背景入手介紹了當前實時計算的發展歷程,Flink 作為實時計算領域的一匹黑馬,先進的設計思想、強大的性能和豐富的業務場景支持,已經是我們開發者必須要學習的技能之一,Flink 已經成為實時計算領域最鋒利的武器!

關注公眾號:大數據技術派,回復資料,領取1024G資料。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM