Flink 提供了不一樣級別的抽象,以開發流或批處理做業。 html
底層 過程函數(Process Function)與 DataStream API 相集成,使其能夠對某些特定的操做進行底層的抽象。DataSet API 爲有界數據集提供了額外的原語,錄入循環與迭代。redis
你能夠在表與 DataStream/DataSet 之間無縫切換,以容許程序將 Table API 與 DataStream 以及 DataSet 混合使用。數據庫
Flink程序的基礎構建模塊是 流(streams) 與 轉換(transformations)。(須要注意的是,Flink的DataSet API所使用的DataSets其內部也是流——更多內容將在以後討論。)概念上來說,流是(可能永無止境的)數據記錄流,而 轉換 是一種操做,它取一個或多個流做爲輸入,並生產出一個或多個輸出流做爲結果。apache
執行時,Flink程序映射到 流數據流(streaming dataflows) ,由 流 以及轉換 算符 構成。每個數據流起始於一個或多個 source,並終止於一個或多個 sink。數據流相似於任意的 有向無環圖 (DAG) 。雖然經過 迭代 構造容許特定形式的環,可是大多數狀況下,簡單起見,咱們都不考慮這一點。編程
一般,程序中的轉換與數據流中的操做之間是一對一的關係。有時,然而,一個轉換可能由多個轉換操做構成。windows
Flink程序本質上是並行分佈的。在執行過程當中,一個 流 包含一個或多個 流分區 ,而每個 算符 包含一個或多個 算符子任務 。操做子任務間彼此獨立,以不一樣的線程執行,甚至有可能運行在不一樣的機器或容器上。數據結構
算符子任務的數量即這一特定算符的 並行度 。一個流的並行度即其生產算符的並行度。相同程序中的不一樣的算符可能有不一樣級別的並行度。 編程語言
流在兩個算符之間傳輸數據,能夠經過 一對一 (或稱 forwarding )模式,或者經過 redistributing 模式:函數
聚合事件(好比計數、求和)在流上的工做方式與批處理不一樣。好比,對流中的全部元素進行計數是不可能的,由於一般流是無限的(無界的)。相反,流上的聚合須要由 窗口 來劃定範圍,好比 「計算過去的5分鐘」 ,或者 「最後100個元素的和」 。優化
窗口能夠是 事件驅動的 (好比:每30秒)或者 數據驅動的 (好比:每100個元素)。窗口一般被區分爲不一樣的類型,好比 滾動窗口 (沒有重疊), 滑動窗口 (有重疊),以及 會話窗口 (由不活動的間隙所打斷)
更多窗口的案例能夠查看這個博客。
當提到流程序(例如定義窗口)中的時間時,你能夠參考不一樣的時間概念:
更多關於如何處理時間的細節能夠查看事件時間文檔.
儘管數據流中的不少操做一次只查看一個獨立的事件(好比事件解析器),有些操做卻會記錄多個事件間的信息(好比窗口算符)。 這些操做被稱爲 有狀態的 。
有狀態操做的狀態保存在一個可被視做嵌入式鍵/值存儲的部分中。狀態與由有狀態算符讀取的流一塊兒被嚴格地分區與分佈。所以,只能訪問一個 keyBy() 函數以後的 keyed streams 的鍵/值狀態,而且僅限於與當前事件鍵相關聯的值。對齊流和狀態的鍵確保了全部狀態更新都是本地操做,以在沒有事務開銷的狀況下確保一致性。這種對齊還使得Flink能夠透明地從新分配狀態與調整流的分區。
Flink使用 流重放 與 Checkpoint 的結合實現了容錯。Checkpoint與每個輸入流及其相關的每個算符的狀態的特定點相關聯。一個流數據流能夠能夠從一個checkpoint恢復出來,其中經過恢復算符狀態並從檢查點重放事件以保持一致性(一次處理語義)
檢查點間隔是以恢復時間(須要重放的事件數量)來消除執行過程當中容錯的開銷的一種手段。
更多關於checkpoint與容錯的細節能夠查看容錯文檔。
Flink將批處理程序做爲流處理程序的特殊狀況來執行,只是流是有界的(有限個元素)。 DataSet 內部被視爲數據流。上述適用於流處理程序的概念一樣適用於批處理程序,除了一些例外: