Flink簡介
-
Apache Flink是一個開源的 分布式、高性能、高可用的流處理框架。
-
主要有Java代碼實現,支持scala和java API。
-
支持 實時流(stream)處理和 批(batch)處理,批數據只是流數據的一個極限特例。
-
Flink原生支持了 迭代計算、 內存管理和 程序優化。
Flink、Spark和Storm對比
Flink、Spark Streaming、Storm、Storm Trient都可以進行實時計算,但各有特點。
在大數據處理領域,批處理任務和流處理任務一般被認為是兩種不同的任務,一個大數據框架一般會被設計為只能處理其中一種任務
* 例如Storm只支持流處理任務,而MapReduce、Spark只支持批處理任務。Spark Streaming是采用了一種micro-batch的架構,即把輸入的數據流且分為細粒度的batch,並為每一個batch數據提交一個批處理的Spark任務,所以Spark Streaming本質上還是基於Spark批處理系統對流式數據進行處理,和Storm等完全流式的數據處理方式完全不同。
* Flink通過靈活的執行引擎,能夠同時支持批處理任務和流處理任務
在執行引擎這一層,流處理系統與批處理系統最大的不同在於節點間的數據傳輸方式。
對於一個流處理系統,其節點間數據傳輸的標准模型是:當一條數據被處理完成后,序列化到緩存中,然后立刻通過網絡傳輸到下一個節點,由下一個節點繼續處理。
而對於一個批處理系統,其節點間數據傳輸的標准模型是:當一條數據被處理完成后,序列化到緩存中,並不會立刻通過網絡傳輸到下一個節點,當緩存寫滿,就持久化到本地硬盤上,當所有數據都被處理完成后,才開始將處理后的數據通過網絡傳輸到下一個節點。
這兩種數據傳輸模式是兩個極端,對應的是流處理系統對低延遲的要求和批處理系統對高吞吐量的要求。
Flink的執行引擎采用了一種十分靈活的方式,同時支持了這兩種數據傳輸模型。
Flink以固定的緩存塊為單位進行網絡數據傳輸,用戶可以通過設置緩存塊超時值指定緩存塊的傳輸時機。如果緩存塊的超時值為0,則Flink的數據傳輸方式類似上文所提到流處理系統的標准模型,此時系統可以獲得最低的處理延遲。
如果緩存塊的超時值為無限大,則Flink的數據傳輸方式類似上文所提到批處理系統的標准模型,此時系統可以獲得最高的吞吐量。
同時緩存塊的超時值也可以設置為0到無限大之間的任意值。緩存塊的超時閾值越小,則Flink流處理執行引擎的數據處理延遲越低,但吞吐量也會降低,反之亦然。通過調整緩存塊的超時閾值,用戶可根據需求靈活的權衡系統延遲和吞吐量。
如何選擇實時框架:
1:需要關注流數據是否需要進行狀態管理
2:At-least-once或者Exectly-once消息投遞模式是否有特殊要求
3:對於小型獨立的項目,並且需要低延遲的場景,建議使用storm
4:如果你的項目已經使用了spark,並且秒級別的實時處理可以滿足需求的話,建議使用spark streaming
5:要求消息投遞語義為Exactly Once的場景;數據量較大,要求高吞吐低延遲的場景;需要進行狀態管理或窗口統計的場景,建議使用flink
Flink架構
- 支持scala和java API
- 支持Table(SQL)
- 支持圖操作(Flink Gelly)
- 支持機器學習(Flink ML)
- 支持將Flink程序部署到Yarn
Flink基本組件
Flink應用場景分析
- 優化電商網站的實時搜索結果
- 針對數據分析團隊提供實時流處理服務
- 網絡/傳感器檢測和錯誤檢測
- 商業智能分析ETL