Flink 從 0 到 1 學習 —— 第一章 Flink 簡介

dwjf321發表於2020-10-14

1.1 初始 Flink

Flink 起源於 Stratosphere 專案,Stratosphere 是在 2010~2014 年由 3 所地處柏林 的大學和歐洲的一些其他的大學共同進行的研究專案,2014 年 4 月 Stratosphere 的 代 碼被 複製 並捐贈 給了 Apache 軟體基 金會, 參加 這個 孵化項 目的 初始 成員 是 Stratosphere 系統的核心開發人員,2014 年 12 月,Flink 一躍成為 Apache 軟體基金 會的頂級專案。

在德語中,Flink 一詞表示快速和靈巧,專案採用一隻松鼠的彩色圖案作為 logo, 這不僅是因為松鼠具有快速和靈巧的特點,還因為柏林的松鼠有一種迷人的紅棕色, 而 Flink 的松鼠 logo 擁有可愛的尾巴,尾巴的顏色與 Apache 軟體基金會的 logo 顏 色相呼應,也就是說,這是一隻 Apache 風格的松鼠。

Flink 從 0 到 1 學習 —— 第一章 Flink 簡介 Flink 從 0 到 1 學習 —— 第一章 Flink 簡介

Flink 專案的理念是:“Apache Flink 是為分散式、高效能、隨時可用以及準確 的流處理應用程式打造的開源流處理框架”。

Apache Flink 是一個框架和分散式處理引擎,用於對無界和有界資料流進行有 狀態計算。Flink 被設計在所有常見的叢集環境中執行,以記憶體執行速度和任意規模 來執行計算。

在這裡插入圖片描述

1.2 Flink 的重要特點

1.2.1 事件驅動型(Event-driven)

事件驅動型應用是一類具有狀態的應用,它從一個或多個事件流提取資料,並 根據到來的事件觸發計算、狀態更新或其他外部動作。比較典型的就是以 kafka 為 代表的訊息佇列幾乎都是事件驅動型應用。

與之不同的就是 SparkStreaming 微批次,如圖:

在這裡插入圖片描述

事件驅動型:

在這裡插入圖片描述

1.2.2 流與批的世界觀

批處理的特點是有界、持久、大量,非常適合需要訪問全套記錄才能完成的計算工作,一般用於離線統計。

流處理的特點是無界、實時, 無需針對整個資料集執行操作,而是對通過系統傳輸的每個資料項執行操作,一般用於實時統計。

在 spark 的世界觀中,一切都是由批次組成的,離線資料是一個大批次,而實 時資料是由一個一個無限的小批次組成的。

而在 flink 的世界觀中,一切都是由流組成的,離線資料是有界限的流,實時數 據是一個沒有界限的流,這就是所謂的有界流和無界流。

無界資料流:無界資料流有一個開始但是沒有結束,它們不會在生成時終止並 提供資料,必須連續處理無界流,也就是說必須在獲取後立即處理 event。對於無界 資料流我們無法等待所有資料都到達,因為輸入是無界的,並且在任何時間點都不 會完成。處理無界資料通常要求以特定順序(例如事件發生的順序)獲取 event,以 便能夠推斷結果完整性。

有界資料流:有界資料流有明確定義的開始和結束,可以在執行任何計算之前 通過獲取所有資料來處理有界流,處理有界流不需要有序獲取,因為可以始終對有 界資料集進行排序,有界流的處理也稱為批處理。
在這裡插入圖片描述

這種以流為世界觀的架構,獲得的最大好處就是具有極低的延遲。

1.2.3 分層 api

在這裡插入圖片描述

最底層級的抽象僅僅提供了有狀態流,它將通過過程函式(Process Function) 被嵌入到 DataStream API 中。底層過程函式(Process Function) 與 DataStream API 相整合,使其可以對某些特定的操作進行底層的抽象,它允許使用者可以自由地處理 來自一個或多個資料流的事件,並使用一致的容錯的狀態。除此之外,使用者可以注 冊事件時間並處理時間回撥,從而使程式可以處理複雜的計算。

實際上,大多數應用並不需要上述的底層抽象,而是針對核心 API(Core APIs) 進行程式設計,比如 DataStream API(有界或無界流資料)以及 DataSet API(有界資料 集)。這些 API 為資料處理提供了通用的構建模組,比如由使用者定義的多種形式的轉換(transformations),連線(joins),聚合(aggregations),視窗操作(windows) 等等。DataSet API 為有界資料集提供了額外的支援,例如迴圈與迭代。這些 API 處理的資料型別以類(classes)的形式由各自的程式語言所表示。

Table API 是以表為中心的宣告式程式設計,其中表可能會動態變化(在表達流資料 時)。Table API 遵循(擴充套件的)關係模型:表有二維資料結構(schema)(類似於 關聯式資料庫中的表),同時 API 提供可比較的操作,例如 select、project、join、group-by、 aggregate 等。Table API 程式宣告式地定義了什麼邏輯操作應該執行,而不是準確地 確定這些操作程式碼的看上去如何。

儘管 Table API 可以通過多種型別的使用者自定義函式(UDF)進行擴充套件,其仍不 如核心 API 更具表達能力,但是使用起來卻更加簡潔(程式碼量更少)。除此之外, Table API 程式在執行之前會經過內建優化器進行優化。

你可以在表與 DataStream/DataSet 之間無縫切換,以允許程式將 Table API 與 DataStream 以及 DataSet 混合使用。 Flink 提供的最高層級的抽象是 SQL 。這一層抽象在語法與表達能力上與 Table API 類似,但是是以 SQL 查詢表示式的形式表現程式。SQL 抽象與 Table API 互動密切,同時 SQL 查詢可以直接在 Table API 定義的表上執行。

目前 Flink 作為批處理還不是主流,不如 Spark 成熟,所以 DataSet 使用的並不 是很多。Flink Table API 和 Flink SQL 也並不完善,大多都由各大廠商自己定製。所 以我們主要學習 DataStream API 的使用。實際上 Flink 作為最接近 Google DataFlow 模型的實現,是流批統一的觀點,所以基本上使用 DataStream 就可以了。

Flink 幾大模組

  • Flink Table & SQL(還沒開發完)
  • Flink Gelly(圖計算)
  • Flink CEP(複雜事件處理)

相關文章