Flink 入門

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

數據能夠做爲無界流或有界流被處理後端

  • Unbounded streams(無界流)有一個起點,但沒有定義的終點。它們不會終止,並且會源源不斷的提供數據。無邊界的流必須被連續地處理,即事件達到後必須被當即處理。等待全部輸入數據到達是不可能的,由於輸入是無界的,而且在任什麼時候間點都不會完成。處理無邊界的數據一般要求以特定順序(例如,事件發生的順序)接收事件,以便可以推斷出結果的完整性。
  • Bounded streams(有界流)有一個定義的開始和結束。在執行任何計算以前,能夠經過攝取(提取)全部數據來處理有界流。處理有界流不須要有序攝取,由於有界數據集老是能夠排序的。有界流的處理也稱爲批處理。

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是一個通用的處理框架,能夠處理任何類型的流。 

  • Bounded and unbounded streams : 流能夠是無邊界的,也能夠是有邊界的。Flink具備複雜的特性來處理無界流,但也有專門的操做符來高效地處理有界流。
  • Real-time and recorded streams : 全部數據都以流的形式生成。有兩種處理數據的方法。在生成流時對其進行實時處理,或將流持久化到存儲系統,並在之後進行處理。Flink應用程序能夠處理記錄的流和實時流。 

State(狀態) 

每一個重要的流應用程序都是有狀態的,只有在個別事件上應用轉換的應用程序纔不須要狀態。任何運行基本業務邏輯的應用程序都須要記住事件或中間結果,以便在稍後的時間點訪問它們,例如在接收下一個事件時或在特定的持續時間以後。

 

在Flink中,應用程序狀態是很是重要的。這一點在不少地方都有體現:

  • Multiple State Primitives : Flink爲不一樣的數據結構(例如,原子值、list、map等)提供狀態原語
  • Pluggable State Backends : 應用程序狀態由可插入狀態後端管理並進行檢查點
  • Exactly-once state consistency : Flink的檢查點和恢復算法保證了故障狀況下應用狀態的一致性
  • Very Large State : 因爲其異步和增量檢查點算法,Flink可以維護幾個tb大小的應用程序狀態
  • Scalable Applications : 經過將狀態從新分配給更多或更少的worker,Flink支持有狀態應用程序的伸縮

Time(時間)

時間是流應用程序的另外一個重要組成部分。大多數事件流具備固有的時間語義,由於每一個事件都是在特定的時間點產生的。此外,許多常見的流計算都是基於時間的,好比窗口聚合、會話、模式檢測和基於時間的鏈接。流處理的一個重要方面是應用程序如何度量時間,即事件時間和處理時間的差別。

Flink提供了一組豐富的與時間相關的特性:

  • Event-time Mode : 使用事event-time語義處理流的應用程序根據事件的時間戳計算結果。所以,不管是處理記錄的事件仍是實時事件,事件時間處理均可以提供準確一致的結果。
  • Watermark Support : Flink在事件時間應用程序中使用水印來推斷時間。 水印仍是權衡結果的延遲和完整性的靈活機制。
  • Late Data Handling : 在帶有水印的事件時間模式下處理流時,可能會發生全部相關事件到達以前已經完成計算的狀況。這種事件稱爲遲發事件。Flink具備多個選項來處理較晚的事件,例如經過側面輸出從新路由它們並更新先前完成的結果。
  • Processing-time Mode : 除了event-time模式外,Flink還支持processing-time語義。處理時間模式可能適合具備嚴格的低延遲要求的某些應用程序,這些應用程序能夠忍受近似結果。 

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支持的最多見的應用程序類型:

  • Event-driven Applications(事件驅動的應用程序)
  • Data Analytics Applications(數據分析應用程序)
  • Data Pipeline Applications(數據管道應用程序) 

2.1.  Event-driven Applications

事件驅動的應用程序是一個有狀態的應用程序,它從一個或多個事件流中獲取事件,並經過觸發計算、狀態更新或外部操做對傳入的事件做出反應。

事件驅動的應用程序基於有狀態的流處理應用程序。在這種設計中,數據和計算被放在一塊兒,從而能夠進行本地(內存或磁盤)數據訪問。經過按期將檢查點寫入遠程持久存儲,能夠實現容錯。下圖描述了傳統應用程序體系結構和事件驅動應用程序之間的區別。

代替查詢遠程數據庫,事件驅動的應用程序在本地訪問其數據,從而在吞吐量和延遲方面得到更好的性能。能夠按期異步地將檢查點同步到遠程持久存,並且支持增量同步。不只如此,在分層架構中,多個應用程序共享同一個數據庫是很常見的。所以,數據庫的任何更改都須要協調,因爲每一個事件驅動的應用程序都負責本身的數據,所以更改數據表示或擴展應用程序所需的協調較少。

對於事件驅動的應用程序,Flink的突出特性是savepoint。保存點是一個一致的狀態鏡像,能夠用做兼容應用程序的起點。給定一個保存點,就能夠更新或調整應用程序的規模,或者能夠啓動應用程序的多個版本進行A/B測試。

典型的事件驅動的應用程序有:

  • 欺詐檢測
  • 異常檢測
  • 基於規則的提醒
  • 業務流程監控
  • Web應用(社交網絡) 

2.2.  Data Analytics Applications

傳統上的分析是做爲批處理查詢或應用程序對已記錄事件的有限數據集執行的。爲了將最新數據合併到分析結果中,必須將其添加到分析數據集中,而後從新運行查詢或應用程序,結果被寫入存儲系統或做爲報告發出。

有了複雜的流處理引擎,分析也能夠以實時方式執行。流查詢或應用程序不是讀取有限的數據集,而是接收實時事件流,並在使用事件時不斷地生成和更新結果。結果要麼寫入外部數據庫,要麼做爲內部狀態進行維護。Dashboard應用程序能夠從外部數據庫讀取最新的結果,也能夠直接查詢應用程序的內部狀態。

Apache Flink支持流以及批處理分析應用程序,以下圖所示:

典型的數據分析應用程序有:

  • 電信網絡質量監控
  • 產品更新分析及移動應用實驗評估
  • 消費者技術中實時數據的特別分析
  • 大規模圖分析

2.2.  Data Pipeline Applications

提取-轉換-加載(ETL)是在存儲系統之間轉換和移動數據的經常使用方法。一般,會按期觸發ETL做業,以便將數據從事務性數據庫系統複製到分析數據庫或數據倉庫。

數據管道的做用相似於ETL做業。它們轉換和豐富數據,並能夠將數據從一個存儲系統移動到另外一個存儲系統。可是,它們以連續流模式運行,而不是週期性地觸發。所以,它們可以從不斷產生數據的源讀取記錄,並以低延遲將其移動到目的地。例如,數據管道能夠監視文件系統目錄中的新文件,並將它們的數據寫入事件日誌。另外一個應用程序可能將事件流物化到數據庫,或者增量地構建和完善搜索索引。

下圖描述了週期性ETL做業和連續數據管道之間的差別:

與週期性ETL做業相比,連續數據管道的明顯優點是減小了將數據移至其目的地的等待時間。此外,數據管道更通用,可用於更多場景,由於它們可以連續消費和產生數據。

典型的數據管道應用程序有:

  • 電商中實時搜索索引的創建
  • 電商中的持續ETL 

3.  安裝Flink

https://flink.apache.org/downloads.html

下載安裝包,這裏下載的是 flink-1.10.1-bin-scala_2.11.tgz

安裝過程參考 https://ci.apache.org/projects/flink/flink-docs-release-1.10/getting-started/tutorials/local_setup.html

./bin/start-cluster.sh  # Start Flink 

訪問 http://localhost:8081

運行 WordCount 示例

 

文檔

https://flink.apache.org/ 

https://ci.apache.org/projects/flink/flink-docs-release-1.10/getting-started/

相關文章
相關標籤/搜索