【Flink】(一)初識 Flink

一、Flink 簡介

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

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

在這裏插入圖片描述

Flink 項目的理念是:“Apache Flink 是爲分佈式、高性能、隨時可用以及準確的流處理應用程序打造的開源流處理框架”。

Apache Flink 是一個框架和分佈式處理引擎,用於對無界和有界數據流進行有狀態計算。Flink 被設計在所有常見的集羣環境中運行,以內存執行速度和任意規模來執行計算。

在這裏插入圖片描述

二、Flink 的重要特點

2.1 事件驅動型(Event-driven)

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

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

在這裏插入圖片描述

事件驅動型:
在這裏插入圖片描述

2.2 流與批的世界觀

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

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

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

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

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

有界數據流:有界數據流有明確定義的開始和結束,可以在執行任何計算之前通過獲取所有數據來處理有界流,處理有界流不需要有序獲取,因爲可以始終對有界數據集進行排序,有界流的處理也稱爲批處理。

在這裏插入圖片描述

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

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 也並不完善,大多都由各大廠商自己定製。實際上 Flink 作爲最接近 Google DataFlow模型的實現,是流批統一的觀點,所以基本上使用 DataStream 就可以了。

三、Flink 幾大模塊

  • Flink Table & SQL(還沒開發完)
  • Flink Gelly(圖計算)
  • Flink CEP(複雜事件處理)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章