2.1 Apache Flink 基本架構
Flink執行時包含了兩種型別的處理器:
JobManager處理器:也稱之為Master,用於協調分散式執行,它們用來排程task,協調檢查點,協調失敗時恢復等。Flink執行時至少存在一個master處理器,如果配置高可用模式則會存在多個master處理器,它們其中有一個是leader,而其他的都是standby。
TaskManager處理器:也稱之為Worker,用於執行一個dataflow的task(或者特殊的subtask)、資料緩衝和data stream的交換,Flink執行時至少會存在一個worker處理器。

Master和Worker處理器可以直接在物理機上啟動,或者通過像YARN這樣的資源排程框架。
Worker連線到Master,告知自身的可用性進而獲得任務分配。
無界資料流與有界資料流
Flink用於處理有界和無界資料:
無界資料流:無界資料流有一個開始但是沒有結束,它們不會在生成時終止並提供資料,必須連續處理無界流,也就是說必須在獲取後立即處理event。對於無界資料流我們無法等待所有資料都到達,因為輸入是無界的,並且在任何時間點都不會完成。處理無界資料通常要求以特定順序(例如事件發生的順序)獲取event,以便能夠推斷結果完整性。
有界資料流:有界資料流有明確定義的開始和結束,可以在執行任何計算之前通過獲取所有資料來處理有界流,處理有界流不需要有序獲取,因為可以始終對有界資料集進行排序,有界流的處理也稱為批處理。

Apache Flink是一個面向分散式資料流處理和批量資料處理的開源計算平臺,它能夠基於同一個Flink執行時(Flink Runtime),提供支援流處理和批處理兩種型別應用的功能。現有的開源計算方案,會把流處理和批處理作為兩種不同的應用型別,因為它們要實現的目標是完全不相同的:流處理一般需要支援低延遲、Exactly-once保證,而批處理需要支援高吞吐、高效處理,所以在實現的時候通常是分別給出兩套實現方法,或者通過一個獨立的開源框架來實現其中每一種處理方案。例如,實現批處理的開源方案有MapReduce、Tez、Crunch、Spark,實現流處理的開源方案有Samza、Storm。
Flink在實現流處理和批處理時,與傳統的一些方案完全不同,它從另一個視角看待流處理和批處理,將二者統一起來:Flink是完全支援流處理,也就是說作為流處理看待時輸入資料流是無界的;批處理被作為一種特殊的流處理,只是它的輸入資料流被定義為有界的。基於同一個Flink執行時(Flink Runtime),分別提供了流處理和批處理API,而這兩種API也是實現上層面向流處理、批處理型別應用框架的基礎。
資料流程式設計模型
Flink提供了不同級別的抽象,以開發流或批處理作業,如下圖所示:

最底層級的抽象僅僅提供了有狀態流,它將通過過程函式(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定義的表上執行。