Apache Flink是一個框架和分佈式處理引擎,用於在無界和有界數據流上進行有狀態的計算。Flink被設計爲在全部常見的集羣環境中運行,之內存中的速度和任何規模執行計算。html
Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams. Flink has been designed to run in all common cluster environments, perform computations at in-memory speed and at any scale. 算法
1. 什麼是Flink數據庫
1.1. 處理無界和有界數據apache
數據能夠做爲無界流或有界流被處理後端
Apache Flink擅長處理無界和有界數據集。對時間和狀態的精確控制使Flink的運行時可以在無邊界的流上運行任何類型的應用程序。有界流由專門爲固定大小的數據集設計的算法和數據結構在內部處理,從而產生出色的性能。網絡
1.2. 部署應用程序在任何地方數據結構
Flink是一個分佈式系統,須要計算資源才能執行應用程序。Flink能夠與全部常見的羣集資源管理器(如Hadoop YARN,Apache Mesos和Kubernetes)集成,但也能夠設置爲做爲獨立羣集運行。架構
Flink被設計爲可以很好地工做於前面列出的每一個資源管理器。這是經過特定於資源管理器的部署模式實現的,該模式容許Flink以慣用的方式與每一個資源管理器進行交互。框架
部署Flink應用程序時,Flink會根據該應用程序配置自動識別所需的資源,並向資源管理器請求。若是發生故障,Flink會經過請求新資源來替換髮生故障的容器。提交或控制應用程序的全部通訊均經過REST調用進行。這簡化了Flink在許多環境中的集成。異步
1.3. 部署應用程序在任何地方
Flink的設計目的是在任何規模上運行有狀態流應用程序。應用程序可能被並行化爲數千個任務,這些任務分佈在集羣中並同時執行。所以,一個應用程序能夠利用幾乎無限數量的cpu、主內存、磁盤和網絡IO。並且,Flink很容易維護很是大的應用程序狀態。它的異步和增量檢查點算法確保對處理延遲的影響最小,同時保證精確一次(exactly-once)狀態一致性。
1.4. 利用內存性能
有狀態的Flink應用程序針對本地狀態訪問進行了優化。任務狀態始終在內存中維護,若是狀態大小超過可用內存,則在訪問高效的磁盤數據結構中維護。所以,任務經過訪問本地(一般在內存中)狀態來執行全部計算,從而產生很是低的處理延遲。經過按期異步將本地狀態檢查點指向持久存儲,Flink確保了故障發生時的一次狀態一致性。
1.5. 流應用程序的構建塊
流應用程序的類型由框架控制流、狀態和時間的能力來定義
Streams(流)
Flink是一個通用的處理框架,能夠處理任何類型的流。
State(狀態)
每一個重要的流應用程序都是有狀態的,只有在個別事件上應用轉換的應用程序纔不須要狀態。任何運行基本業務邏輯的應用程序都須要記住事件或中間結果,以便在稍後的時間點訪問它們,例如在接收下一個事件時或在特定的持續時間以後。
在Flink中,應用程序狀態是很是重要的。這一點在不少地方都有體現:
Time(時間)
時間是流應用程序的另外一個重要組成部分。大多數事件流具備固有的時間語義,由於每一個事件都是在特定的時間點產生的。此外,許多常見的流計算都是基於時間的,好比窗口聚合、會話、模式檢測和基於時間的鏈接。流處理的一個重要方面是應用程序如何度量時間,即事件時間和處理時間的差別。
Flink提供了一組豐富的與時間相關的特性:
1.6. 分層API
Flink提供了三層API。每一個API在簡潔性和表達性之間提供了不一樣的權衡,而且針對不一樣的使用場景
1.7. Stateful Functions
Stateful Functions 是一個API,它簡化了分佈式有狀態應用程序的構建。
2. 應用場景
Apache Flink是開發和運行許多不一樣類型應用程序的最佳選擇,由於它具備豐富的特性。Flink的特性包括支持流和批處理、複雜的狀態管理、事件處理語義以及確保狀態的一致性。此外,Flink能夠部署在各類資源提供程序上,例如YARN、Apache Mesos和Kubernetes,也能夠做爲裸機硬件上的獨立集羣進行部署。配置爲高可用性,Flink沒有單點故障。Flink已經被證實能夠擴展到數千個內核和TB級的應用程序狀態,提供高吞吐量和低延遲,並支持世界上一些最苛刻的流處理應用程序。
下面是Flink支持的最多見的應用程序類型:
2.1. Event-driven Applications
事件驅動的應用程序是一個有狀態的應用程序,它從一個或多個事件流中獲取事件,並經過觸發計算、狀態更新或外部操做對傳入的事件做出反應。
事件驅動的應用程序基於有狀態的流處理應用程序。在這種設計中,數據和計算被放在一塊兒,從而能夠進行本地(內存或磁盤)數據訪問。經過按期將檢查點寫入遠程持久存儲,能夠實現容錯。下圖描述了傳統應用程序體系結構和事件驅動應用程序之間的區別。
代替查詢遠程數據庫,事件驅動的應用程序在本地訪問其數據,從而在吞吐量和延遲方面得到更好的性能。能夠按期異步地將檢查點同步到遠程持久存,並且支持增量同步。不只如此,在分層架構中,多個應用程序共享同一個數據庫是很常見的。所以,數據庫的任何更改都須要協調,因爲每一個事件驅動的應用程序都負責本身的數據,所以更改數據表示或擴展應用程序所需的協調較少。
對於事件驅動的應用程序,Flink的突出特性是savepoint。保存點是一個一致的狀態鏡像,能夠用做兼容應用程序的起點。給定一個保存點,就能夠更新或調整應用程序的規模,或者能夠啓動應用程序的多個版本進行A/B測試。
典型的事件驅動的應用程序有:
2.2. Data Analytics Applications
傳統上的分析是做爲批處理查詢或應用程序對已記錄事件的有限數據集執行的。爲了將最新數據合併到分析結果中,必須將其添加到分析數據集中,而後從新運行查詢或應用程序,結果被寫入存儲系統或做爲報告發出。
有了複雜的流處理引擎,分析也能夠以實時方式執行。流查詢或應用程序不是讀取有限的數據集,而是接收實時事件流,並在使用事件時不斷地生成和更新結果。結果要麼寫入外部數據庫,要麼做爲內部狀態進行維護。Dashboard應用程序能夠從外部數據庫讀取最新的結果,也能夠直接查詢應用程序的內部狀態。
Apache Flink支持流以及批處理分析應用程序,以下圖所示:
典型的數據分析應用程序有:
2.2. Data Pipeline Applications
提取-轉換-加載(ETL)是在存儲系統之間轉換和移動數據的經常使用方法。一般,會按期觸發ETL做業,以便將數據從事務性數據庫系統複製到分析數據庫或數據倉庫。
數據管道的做用相似於ETL做業。它們轉換和豐富數據,並能夠將數據從一個存儲系統移動到另外一個存儲系統。可是,它們以連續流模式運行,而不是週期性地觸發。所以,它們可以從不斷產生數據的源讀取記錄,並以低延遲將其移動到目的地。例如,數據管道能夠監視文件系統目錄中的新文件,並將它們的數據寫入事件日誌。另外一個應用程序可能將事件流物化到數據庫,或者增量地構建和完善搜索索引。
下圖描述了週期性ETL做業和連續數據管道之間的差別:
與週期性ETL做業相比,連續數據管道的明顯優點是減小了將數據移至其目的地的等待時間。此外,數據管道更通用,可用於更多場景,由於它們可以連續消費和產生數據。
典型的數據管道應用程序有:
3. 安裝Flink
https://flink.apache.org/downloads.html
下載安裝包,這裏下載的是 flink-1.10.1-bin-scala_2.11.tgz
./bin/start-cluster.sh # Start Flink
訪問 http://localhost:8081
運行 WordCount 示例
文檔
https://ci.apache.org/projects/flink/flink-docs-release-1.10/getting-started/