海量數據實時分析引擎 Apache Flink

摘要:當系統出現大量或者重大的錯誤卻不被人感知,將會對業務產生影響,從而導致資產損失。當競爭對手實施了新戰術,卻無法及時感知,跟不上競爭對手的節奏,總是追着對方尾巴走。當要做決策的時候,海量的業務數據增長卻無法實時看到聚合結果,決策總是憑藉過往經驗或者過時的數據分析之上。

可以看到如果沒有數據分析,我們的系統大部分時間處於黑盒狀態,對業務的決策也只能憑藉過往經驗。實時與批量的數據分析可以幫助企業洞察錯誤,改善服務,進行決策。數據分析也是營銷、運維、決策的重要支撐,越來越多的企業和部門已經意識到實時與批量數據的分析價值,開始進行數據分析系統的建設。

而在做數據分析時候要考慮數據的時效性,需要根據場景來選擇離線數據分析或者是實時數據分析。

離線數據分析一般是根據固定的週期,比如每天統計一次,每週統計一次等類似於定時任務執行的場景,一般大家稱爲“批處理” 。

實時數據分析一般基於數據事件,數據產生了就立即處理,數據在源源不斷的產生,計算也在不停地運行,就像是一直流動的水流一樣經過層層的管道計算處理,一般大家稱爲”流處理“。

批處理和流處理各有優缺點

批處理更有利於對歷史數據,最終數據狀態等場景的處理,可有效的計算出比較準確的結果,但是數據分析結果的實時性不太好。批處理的場景:例如我們的微信運動排名、信用卡的月賬單等。

流處理的數據實時性是非常好的,數據所見即所得,不過實時的數據分析與計算對資源消耗比較大,如果後續數據發生了改變前期無法計算數據的最終狀態。流處理的場景:例如小視頻的實時個性化推薦、雙十一實時金額的滾動大盤等。

可以看到一般情況下批處理更關注的是海量離線數據的完整性和對海量數據快速計算處理的能力,流處理更關注的是數據的時效性和快速計算處理能力。不過一個完備的大數據批處理和流處理中間件不僅僅需要關注高吞吐量、低延遲這樣的基礎性能相關的功能,更需要支持狀態和故障恢復等高可用的能力 。

Apache Flink 正是一個具備高性能和高可用的批流處理大數據中間件,同時還具備批流一體的處理能力,流處理也在業界處於領先水平。被廣大互聯網公司使用,下面我們就來進入正題看下關於 Apache Flink 的一些內容吧。

Apache Flink 是什麼?

根據官網的介紹:Apache Flink 是一個在有界數據流和無界數據流上進行有狀態計算的分佈式處理引擎和框架。Flink 設計旨在所有常見的集羣環境中運行,以任意規模和內存級速度執行計算。下面兩個圖是來自官方首頁的Flink 批流處理的架構圖,可以整體來看一下。

整體來看Flink這樣的流批系統主要包含了採集數據(source),處理數據(process),導出數據(sink) 三個部分。採集數據方式包含了實時數據的流處理和歷史數據的批處理方式。數據源可以來源於應用、設備、日誌,數據庫等其他數據,導出數據與導入數據一樣可以將數據導出到各種類別的接收數據的服務。除了採集數據和導出數據,Flink中最核心的內容還有中間通過流式計算來處理有狀態和無狀態的數據這一部分,下面就來看一看。

在 Flink 中,應用程序由用戶自定義算子轉換而來的流式 dataflows 所組成。這些流式 dataflows 形成了有向圖,以一個或多個源(source)開始,並以一個或多個匯(sink)結束,如下圖所示。

其中 Flink 的流處理在業界處於領先水平,對於流處理的一些概念有必要再深入瞭解一下。

前面已經簡單介紹過流處理的一些概念下面就來看下與流相關的其他名詞。

有界和無界的數據流

無界流 有定義流的開始,但沒有定義流的結束。它們會無休止地產生數據。無界流的數據必須持續處理,即數據被攝取後需要立刻處理。我們不能等到所有數據都到達再處理。

有界流 有定義流的開始,也有定義流的結束。有界流可以在攝取所有數據後再進行計算。有界流所有數據可以被排序,所以並不需要有序攝取。有界流處理通常被稱爲批處理。

流可以是無界的,也可以是有界的,例如固定大小的數據集Flink 在無界的數據流處理上擁有諸多功能強大的特性,同時也針對有界的數據流開發了專用的高效算子。

實時和歷史記錄的數據流

所有的數據都是以流的方式產生,但用戶通常會使用兩種截然不同的方法處理數據。或是在數據生成時進行實時的處理;亦或是先將數據流持久化到存儲系統中——例如文件系統或對象存儲,然後再進行批處理。Flink 的應用能夠同時支持處理實時以及歷史記錄數據流。

狀態

狀態這個詞語 ChatGPT 的解釋如下:

在計算機科學中,狀態是指在特定時間點上,系統或程序的所有變量和值的集合。

Flink 官網是這樣解釋的如下:

任何運行基本業務邏輯的流處理應用都需要在一定時間內存儲所接收的事件或中間結果,以供後續的某個時間點(例如收到下一個事件或者經過一段特定時間)進行訪問並進行後續處理。

對於狀態管理是非常實用的,一般情況下我們都期望我們的應用是無狀態的隨時可以重啓或者擴容,但是實際場景很多時候我們計算的數據需要有一定的記錄來保證冪等或者數據處理的位置。Fink已經爲我們提供了這樣的狀態管理機制直接使用即可。

時間

時間是流處理應用另一個重要的組成部分。因爲事件總是在特定時間點發生,所以大多數的事件流都擁有事件本身所固有的時間語義。例如窗口聚合、會話計算、模式檢測和基於時間的 join。流處理的一個重要方面是應用程序如何衡量時間,即區分事件時間(event-time)和處理時間(processing-time)。

三種時間語義:

  • 事件時間(event time) 事件產生的時間,記錄的是設備生產(或者存儲)事件的時間。
  • 攝取時間(ingestion time) Flink 讀取事件時記錄的時間。
  • 處理時間(processing time) Flink pipeline 中具體算子處理事件的時間。

Flink 提供了 watermarks 機制 — 它們定義何時停止等待較早的事件。

watermarks 給了開發者流處理的一種選擇,它們使開發人員在開發應用程序時可以控制延遲和完整性之間的權衡。

窗口

在數據處理的時候很多數據並非是簡單的累加操作,很多時候需要我們藉助時間窗口進行聚合處理,比如計算最近 5 分鐘的數據的平均值。窗口可以使時間驅動的也可以是數據驅動的,下面是 Flink 提供的幾種窗口概念可以瞭解一下。

  • 滾動時間窗口
    • 每分鐘頁面瀏覽量
    • TumblingEventTimeWindows.of(Time.minutes(1))
  • 滑動時間窗口
    • 每 10 秒鐘計算前 1 分鐘的頁面瀏覽量
    • SlidingEventTimeWindows.of(Time.minutes(1),Time.seconds(10))
  • 會話窗口
    • 每個會話的網頁瀏覽量,其中會話之間的間隔至少爲 30 分鐘
    • EventTimeSessionWindows.withGap(Time.minutes(30))

運維與部署

Flink 是一個多功能的框架,以混搭的方式支持許多不同的部署場景。

Flink 是一個分佈式系統,需要有效分配和管理計算資源才能執行流應用程序。它集成了所有常見的集羣資源管理器,例如 Hadoop YARN,但也可以設置作爲獨立集羣甚至庫運行。

客戶端總是在某處運行。它獲取 Flink 應用程序的代碼,將其轉換爲 JobGraph 並將其提交給 JobManager。

JobManager 將工作分配到 TaskManager 上,實際的運算符(例如源、轉換和接收器)來運行。

入門教程

Java 環境

需要安裝 Java 8 或者 Java 11

安裝包

下載文件:

wget https://www.apache.org/dyn/closer.lua/flink/flink-1.17.0/flink-1.17.0-bin-scala_2.12.tgz

解壓命令如下所示:

$ tar -xzf flink-1.17.0-bin-scala_2.12.tgz
$ cd flink-1.17.0-bin-scala_2.12.tgz

啓動命令如下:

$ ./bin/start-cluster.sh
Starting cluster.
Starting standalonesession daemon on host.
Starting taskexecutor daemon on host.

啓動成功後可以看到下圖所示提示:

提交作業(Job)

Flink 的 Releases 附帶了許多的示例作業。你可以任意選擇一個,快速部署到已運行的集羣上。

$ ./bin/flink run examples/streaming/WordCount.jar
$ tail log/flink-*-taskexecutor-*.out
  (nymph,1)
  (in,3)
  (thy,1)
  (orisons,1)
  (be,4)
  (all,2)
  (my,1)
  (sins,1)
  (remember,1)
  (d,4)

WebUI 中觀察作業

打開UI控制檯可以看到如下JOB的運行狀態:

控制檯地址:http://localhost:8081/

停止集羣

$ ./bin/stop-cluster.sh

總結

從業務角度看

Apache Flink 是一個分佈式流處理引擎,可以用於解決許多與數據處理相關的問題,包括:

  1. 實時數據處理:Flink 可以處理實時數據流並對其進行計算和分析,可以處理數據的實時窗口和時序分析等應用場景。
  2. 批處理:Flink 也支持批處理,可以處理大規模的離線數據,實現高效的數據分析和計算。
  3. 機器學習:Flink 提供了機器學習庫 FlinkML,可以在分佈式集羣上訓練和測試機器學習模型。
  4. 事件驅動應用程序:Flink 可以處理事件驅動應用程序,如應用程序狀態管理、流式事件處理和複雜事件處理。
  5. 實時數據倉庫:Flink 可以將實時數據流轉換爲數據倉庫的數據模型,用於實時的 OLAP 分析。

總之,Flink 可以用於解決實時和離線數據處理的許多問題,包括數據流處理、批處理、機器學習和事件驅動應用程序等。

從技術角度看

Apache Flink 是一種高性能、低延遲的分佈式數據流處理框架,它具有以下優點,因此成爲數據分析和處理的重要工具之一:

  1. 高性能:Flink 在處理數據時可以保證非常高的吞吐量和低延遲,可以在處理實時數據時實現毫秒級的響應。
  2. 分佈式處理:Flink 可以在分佈式環境下運行,可以處理大規模數據集,並能夠自動進行數據分區和負載均衡。
  3. 可靠性:Flink 具有高可靠性,可以處理丟失的數據並保證結果的準確性。
  4. 靈活性:Flink 支持多種數據源和數據格式,並提供了豐富的 API 和庫,可以方便地進行數據處理和分析。
  5. 處理複雜事件:Flink 支持複雜事件處理,可以識別和處理包含多個事件的複雜事件。
  6. 支持多種部署方式:Flink 可以在本地環境、YARN、Mesos、Kubernetes 等不同的環境下運行,便於部署和管理。

基於這些優點,Flink 被廣泛應用於各大互聯網公司。

作者|宋小生

原文鏈接

本文爲阿里雲原創內容,未經允許不得轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章