從疑問入手瞭解Flink
從疑問入手瞭解Flink
Flink網上的資料比起Spark來說是少很多的,我在學習的過程中有一些疑問,然後從疑問入手學習並參考官網文件和阿里的雲棲社群總結。
批處理和流處理的區別?
最大的區別就是二者對流計算認知的不同。微批處理模式Micro-Batching計算模型可以理解成是"流是批的特例",而純流處理模式Native Streaming則是“批是流的特例”。MapReduce是批處理、Spark是為微批處理、Flink是純流式處理。當然Flink支援的批處理是在Native Streaming模式的框架上實現的。
Flink會在什麼地方觸發容錯機制?
在有大量機器的叢集中,其中一個節點計算錯誤或者宕機可能會導致程式執行失敗,或者得到錯誤的結果。目前Flink支援兩種資料容錯機制分別是:At Least Once至少消費一次,可能存在重複消費和Exactly Once:精確一次。同時Flink容錯可以歸納為三種場景
-
系統內部容錯時 自身運算元
Flink基於自身的CheckPointing機制實現了剛提到的兩種容錯模式。
-
讀取外部資料來源時 Source
一般外部Source都支援 At Least Once模式,如果希望有Exactly Once模式那麼就需要對應外部資料來源有記錄position的支援,可以記錄當前讀取位置,並且支援根據位置進行讀取類似Kafka。
-
落地到外部資料來源時 Sink
同外部資料來源Source
Flink什麼時候用批處理什麼時候用流處理
Flink在網路傳輸層上有兩種模式:PIPELINED模式即一條資料處理完立刻傳輸給下一個節點處理和BATCH模式即將資料快取起來等所有資料處理完後在傳輸到下個節點處理。
我認為一般情況如Map和Count為了更低的延遲和效能都是PIPELINED模式更加高效,但如果要有Sort、Merge、Join這類操作批處理會使用BATCH模式。
Flink中的Table/SQL api到底是如何轉換成DataStream和DataSet的呢?
Flink是使用的Apache開源的Calcite專案做SQL解析的。入門可參考文章
Calcite通過Java CC將SQL解析成AST樹,經過校驗、優化後進行執行,將物理執行計劃轉化成Flink可執行的程式。
引用雲棲社群的一張圖

image.png
運算元如何分類?
看完官網有很多概念比如Scalar Function、Table Function、Aggregate Function、UDF、UDTF、UDAF等等,他們的關係需要縷一下,其實指的都是不同層面上的相同意思。
可以先把Flink的運算元分為 單流操作 和 多流操作 。
多流操作 - 可以分為UNION-將欄位一致的資料流合併和 JOIN-將資料型別不一致的的資料流連線成一個數據流。多流操作的目的都是將多個數據流合併成一個數據流再進行操作。
單流操作 - 按輸入輸出歸類
型別 | 輸入 | 輸出 | Table/SQL運算元 | DataStream/DataSet運算元 |
---|---|---|---|---|
Scalar Function | 1 | 1 | Built-in & UDF | Map |
Table Function | 1 | N(N>=0) | Built-in & UDTF | FlatMap |
Aggregate Function | N(N>=0) | 1 | Built-in & UDAF | Reduce |