Apache Flink系列-①什麼是Apache Flink? Apache Flink是一個框架和分散式處理引擎,用於在無界和有界數據流上進行有狀態計算。Flink被設計為在所有常見的集群環境中運行,以記憶體速度和任何規模執行計算。 在這裡,我們解釋Flink’s架構重要的各個方面。 處理無界和有 ...
Apache Flink系列-①什麼是Apache Flink?
Apache Flink是一個框架和分散式處理引擎,用於在無界和有界數據流上進行有狀態計算。Flink被設計為在所有常見的集群環境中運行,以記憶體速度和任何規模執行計算。
在這裡,我們解釋Flink’s架構重要的各個方面。
處理無界和有界數據
任何類型的數據都是以事件流的形式產生的。信用卡交易、感測器測量、機器日誌或網站或移動應用程式上的用戶交互,所有這些數據都以流的形式生成。
數據可以作為無界流或有界流進行處理。
無界流有起點,但沒有定義的終點。它們不會在生成數據時終止並提供數據。無界流必須持續處理,即事件被攝入後必須立即處理。不可能等待所有輸入數據到達,因為輸入是無限的,在任何時間點都不會完成。處理無界數據通常需要按照特定的順序接收事件,例如事件發生的順序,以便能夠對結果的完整性進行推理。
有界流有一個定義的起點和終點。在執行任何計算之前,可以通過攝取所有數據來處理有界流。處理有界流不需要有序攝取,因為有界數據集總是可以排序的。有界流的處理也稱為批處理。
Apache Flink擅長處理無界和有界數據集。對時間和狀態的精確控制使Flink的運行時能夠在無限流上運行任何類型的應用程式。有界流由專門為固定大小的數據集設計的演算法和數據結構進行內部處理,從而產生優異的性能。
通過探索建立在Flink之上的用例來說服自己。
在任何地方部署應用程式
Apache Flink是一個分散式系統,需要計算資源才能執行應用程式。Flink與所有常見的集群資源管理器(如Hadoop Thread、Apache Mesos和Kubernetes)集成,但也可以設置為作為獨立集群運行。
Flink的設計目的是讓之前列出的每一位資源經理都能很好地工作。這是通過特定於資源管理器的部署模式實現的,這些模式允許Flink以其慣用的方式與每個資源管理器交互。
部署Flink應用程式時,Flink會根據應用程式配置的並行性自動識別所需的資源,並從資源管理器請求這些資源。如果失敗,Flink會通過請求新資源來替換失敗的容器。提交或控制應用程式的所有通信都是通過REST調用進行的。這簡化了Flink在許多環境中的集成。
以任意規模運行應用程式
Flink旨在以任何規模運行有狀態的流媒體應用程式。應用程式被並行化為數千個任務,這些任務在集群中分佈並併發執行。因此,應用程式可以利用幾乎無限量的CPU、主記憶體、磁碟和網路IO。此外,Flink很容易維護非常大的應用程式狀態。它的非同步和增量檢查點演算法確保了對處理延遲的最小影響,同時保證了一次狀態的一致性。
用戶報告稱,在他們的生產環境中運行的Flink應用程式的可擴展性數量令人印象深刻,例如:
- l 每天處理數萬億事件的應用程式,
- l 維護多TB狀態的應用程式,以及
- l 運行在數千個內核上的應用程式
利用記憶體中的性能
有狀態的Flink應用程式針對本地狀態訪問進行了優化。任務狀態始終保持在記憶體中,如果狀態大小超過可用記憶體,則保持在訪問效率高的磁碟數據結構中。因此,任務通過訪問本地(通常在記憶體中)狀態來執行所有計算,從而產生非常低的處理延遲。Flink通過定期、非同步地將本地狀態檢查點設置為持久性存儲,在出現故障時確保一次狀態的一致性。