Flink運行時包含了兩種類型的處理器:數據庫
JobManager處理器:也稱之爲Master,用於協調分佈式執行,它們用來調度task,協調檢查點,協調失敗時恢復等。Flink運行時至少存在一個master處理器,若是配置高可用模式則會存在多個master處理器,它們其中有一個是leader,而其餘的都是standby。編程
TaskManager處理器:也稱之爲Worker,用於執行一個dataflow的task(或者特殊的subtask)、數據緩衝和data stream的交換,Flink運行時至少會存在一個worker處理器。windows
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也是實現上層面向流處理、批處理類型應用框架的基礎。3d
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定義的表上執行。