Flink具有先進的架構理念,擁有諸多的優秀特性以及完善的編程接口,Flink的優勢有以下幾點:
Flink可以在底層用同樣的數據抽象和計算模型來進行批處理和流處理。事實上,Flink在設計理念上沒有刻意強調批處理和流處理,而更多的強調數據的有界和無界,這就意味著Flink能夠滿足企業業務需求,無需用兩種甚至多種框架分別實現批處理和流處理,這大大降低了架構設計、開發、運維的復雜度,可以節省大量的人力成本。
Flink是目前開源社區中唯一一套集高吞吐、低延遲、高性能三者于一身的分布式流式數據處理框架。像Apache Spark也只能兼顧高吞吐和高性能特性,主要因為在SparkStreaming流式計算中無
(資料圖)
法做到低延遲保障;而流式計算框架Apache Storm只能支持低延遲和高性能特性,但是無法滿足高吞吐的要求。而滿足高吞吐、低延遲、高性能這三個目標對分布式流式計算框架來說是非常重要的。
在流式計算領域中,窗口計算的地位舉足輕重,但目前大多數框架窗口計算采用的都是系統時間(Process Time),也是事件傳輸到計算框架處理時,系統主機的當前時間。Flink能夠支持基于事件時間(Event Time)語義進行窗口計算,也就是使用事件產生的時間,這種基于事件驅動的機制使得事件即使亂序到達,流系統也能夠計算出精確的結果,保持了事件原本產生時的時序性,盡可能避免網絡傳輸或硬件系統的影響。
Flink在1.4版本中實現了狀態管理,所謂狀態就是在流式計算過程中將算子的中間結果數據保存在內存或者文件系統中,等下一個事件進入算子后可以從之前的狀態中獲取中間結果中計算當前的結果, 從而無須每次都基于全部的原始數據來統計結果,這種方式極大地提升了系統的性能,并降低了數據計算過程的資源消耗。對于數據量大且運算邏輯非常復雜的流式計算場景,有狀態計算發揮了非常重要的作用。
在流處理應用中,數據是連續不斷的,需要通過窗口的方式對流數據進行一定范圍的聚合計算,例如統計在過去的1分鐘內有多少用戶點擊某一網頁,在這種情況下,我們必須定義一個窗口,用來收集最近一分鐘內的數據,并對這個窗口內的數據進行再計算。Flink將窗口劃分為基于Time、Count、Session,以及Data-driven等類型的窗口操作,窗口可以用靈活的觸發條件定制化來達到對復雜的流傳輸模式的支持,用戶可以定義不同的窗口觸發機制來滿足不同的需求。
Flink能夠分布式運行在上千個節點上,將一個大型計算任務的流程拆解成小的計算過程,然后將task分布到并行節點上進行處理。在任務執行過程中,能夠自動發現事件處理過程中的錯誤而導致數據不一致的問題,比如:節點宕機、網路傳輸問題,或是由于用戶因為升級或修復問題而導致計算服務重啟等。在這些情況下,通過基于分布式快照技術的Checkpoints,將執行過程中的狀態信息進行持久化存儲,一旦任務出現異常停止,Flink就能夠從Checkpoints中進行任務的自動恢復,以確保數據在處理過程中的一致性(Exactly-Once)。
內存管理是所有計算框架需要重點考慮的部分,尤其對于計算量比較大的計算場景,數據在內存中該如何進行管理顯得至關重要。針對內存管理,Flink實現了自身管理內存的機制,盡可能減少JVM GC 對系統的影響。另外,Flink通過序列化/反序列化方法將所有的數據對象轉換成二進制在內存中存儲,降低數據存儲的大小的同時,能夠更加有效地對內存空間進行利用,降低GC帶來的性能下降或任務異常的風險,因此Flink較其他分布式處理的框架會顯得更加穩定,不會因為JVM GC等問題而影響整個應用的運行。
對于7*24小時運行的流式應用,數據源源不斷地接入,在一段時間內應用的終止有可能導致數據的丟失或者計算結果的不準確,例如進行集群版本的升級、停機運維操作等操作。值得一提的是, Flink通過Save Points技術將任務執行的快照保存在存儲介質上,當任務重啟的時候可以直接從事先保存的Save Points恢復原有的計算狀態,使得任務繼續按照停機之前的狀態運行,Save Points技術可以讓用戶更好地管理和運維實時流式應用。
Flink為用戶提供了多個層級API,用戶可以根據自身對于表達力和易用性的需求來選擇,不同的API 層級可以混用以實現復雜的業務邏輯。
關鍵詞:
質檢
推薦