從Flink上談當今實時流處理

0. 序

在當前數據量激增傳統的時代,不同的業務場景都有大量的業務數據產生,對於這些不斷產生的數據應該如何進行有效地處理,成爲當下大多數公司所面臨的問題。

但隨着數據的不斷增長,新技術的不斷髮展,人們逐漸意識到對實時數據處理的重要性,企業需要能夠同時支持高吞吐、低延遲、高性能的流處理技術來處理日益增長的數據。

相對於傳統的數據處理模式,流式數據處理則有着更高的處理效率和成本控制。Apache Flink就是近年來在開源社區發展不斷髮展的能夠支持同時支持高吞吐、低延遲、高性能分佈式處理框架。

Flink是一個分佈式大數據處理引擎,可對有限數據流和無限數據流進行有狀態計算。可以部署在各種集羣環境,對各種大小規模的數據進行快速計算。

 

1.1 Flink 發展歷史

Flink 誕生於2009年,起初誕生於德國柏林大學,最開始設計是爲了解決批處理問題的。於2014年孵化並捐給Apache,2016年開始在阿里大規模應用,從而駛入快車道。

這一切都源於 MillWheel: Fault-Tolerant Stream Processing at

Internet Scale,Google發表的一篇論文,講述瞭如何在大規模系統中實現高吞吐/低延遲/有狀態實時流處理。而Flink也是受到該論文的影響,採用了 Dataflow/Beam 編程模型

 

1.2 Flink VS Spark VS Storm

說到 Flink,很難不說 Spark,我們再結合老牌實時處理工具 Storm 對比一下各自的優劣性。
 

*
 

 

Flink

Spark

Storm

流計算

支持

支持(流是特殊的批)

支持

批計算

支持(批是特殊的流)

支持

不支持

批流結合

較差(需要實現各自API)

API

-

機器學習

支持

支持

-

計算延遲

較高

語義保證

Exactly Once

Exactly Once

At least Once

SQL支持

支持

不支持

支持

狀態管理

支持

支持得不夠好

不支持

  • 流計算方面

當前的 Flink 就是爲了支持流計算而設計的。而 Spark 的流計算是特殊的批,是由連續的微批組成的流式計算。
 

  • 批計算方面

Flink 的批處理是特殊的流,而 Spark 本身的計算模型就是批處理模型。Storm 則不支持批處理。

 

  • 批流融合方面

Flink 的批處理API和流處理API是兩套API,導致一個方法爲了同時支持批處理和流處理需要實現兩次,不過 Flink 的後續版本一直在促進批流融合。

Spark 批流結合則支持的很好,通過 DataFrame 實現的方法既可以支持批處理又可以支持流處理。

  • 機器學習方面

Spark 和 Flink 都提供了豐富的機器學習相關方法庫。Spark 最近幾年的重心都放在了支持機器學習上,並且 Spark 對於 Python以及R都支持得很好,讓一些非Java體系的數據開發人員也能很快入手Spark。Flink 對 Python 的支持、優化也在進行中,並且又阿里主導的 Alink - 全球首個批流一體機器學習平臺,也在國內外十分受歡迎。

  • 計算延遲方面

因爲 Spark 是微批處理,因此處理延遲較 Flink 和 Storm 比較較大。

  • 一致性語義方面

Flink 和 Storm 都實現了 Exactly Once 語義,而 Storm 如果不借助外部數據庫僅支持 At Least Once 語義。

  • 狀態管理方面

Spark 在有狀態實時流處理方面支持地不夠好,僅支持有限的方法,例如updateStateByKey 以及 mapWithState。而 Flink 支持非常豐富的狀態管理方法,這個我們後面也會說到。

 

2. Flink 適用於什麼場景呢?

我們會在什麼時候使用 Flink 呢?或者說哪些場景使用 Flink 能更好地完成呢。

我們來看一個例子,天貓雙11成交額實時監控

 

如果按照傳統的方案會是什麼架構呢?
 

 

首先業務已經由相關人員實時推送至Kafka中,我們會將數據通過ETL工具實時寫入數據倉庫中,通過數據倉庫完成即席查詢實時聚合。這種方案可能因大量數據入庫導致一部分數據延遲,那麼我們還可以通過 Spark 進行數據的預聚合後寫入數倉中,這樣能減少寫入以及查詢的成本。但是這個方案還存在延遲的問題:

1. 整個方案即使優化過還存在較大的延遲,數據寫入/數據查詢

2. 整個方案有太多DB交互過程

那麼如果我們用 Flink 會怎麼實現呢?

 

我們會將成交額當作“狀態”維護在Flink中,定期更新Redis或者MC,這樣我們的圖表可以直接從Reids或者MC中直接讀取成交額信息,這樣可以減少很多DB交互過程,並且Redis或者MC的一次Set或者Get操作也是毫秒級別的。

3. Flink 有哪些特有的功能?

3.1 異步IO

流計算系統中經常需要與外部系統進行交互,我們通常的做法如向數據庫發送用戶a的查詢請求,然後等待結果返回,在結果返回之前,我們的程序無法繼續發送用戶b的查詢請求。這是一種同步訪問方式,如下圖所示。

 

圖中棕色的長條表示等待時間,可以發現網絡交互等待時間極大地阻礙了吞吐和延遲。爲了解決同步訪問的問題,異步模式可以併發地處理多個請求和回覆。也就是說,你可以連續地向數據庫發送用戶a、b、c等的請求,與此同時,哪個請求的回覆先返回了就處理哪個回覆,從而連續的請求之間不需要阻塞等待,如上圖右邊所示,這樣能節省很多網絡交互等待時間。

3.2 CEP 處理

 

CEP全稱爲(Complex Event Processing),Flink CEP庫允許你在流上定義一系列的模式(pattern),最終使得你可以方便的抽取自己需要的重要的事件出來。CEP常用於異常檢測/行爲分析以及實時風控,以下是一個應用簡單的模式匹配實現的用戶異常登陸檢測的例子。

 

匹配10秒內連續兩次登陸失敗的行爲

3.3 多樣的窗口

 

Flink支持多種多樣的窗口來實現各種複雜的統計和計算。常用有以下幾種:

  • Tumbling Windows(滾動窗口)

         各窗口間不重合,常用於實時定時統計,例如服務每秒訪問量

  • Sliding Windows(滑動窗口)

         各窗口間可以重合,常用於判斷事件是否連續,例如每1分鐘統計最近5分鐘服務訪問波動。

3.4 狀態管理

 

狀態(state)是 Flink 程序某個時刻某個 task/operator 的狀態,state數據是程序運行中某一時刻數據結果,這個state數據會保存在taskmanager的內存中,Flink 提供了豐富的狀態訪問和容錯機制支持 Flink 完成有狀態的實時流處理。

  • 多種數據類型

Value,List,Map,Reducing...

  • 多種劃分方式

Keyed State,Operator State

  • 多種存儲方式

MemoryStateBackend, FsStateBackend,RocksDBStateBackend

  • 高效備份和恢復

提供Exactly Once保證

4. 爲什麼Flink收到青睞

瞭解了 Fink 以及 Flink 相關特性,總結一下爲什麼 Flink 爲什麼收到大衆的親睞,被譽爲 Spark 的替代品。

  • 同時支持批處理和實時流程序處理
  • 支持Java和Scala API
  • 支持高吞吐/低延遲實時處理數據
  • 支持在不同的時間下支持靈活的窗口
  • 自動反壓機制
  • Exactly Once語義保證
  • 豐富的狀態管理
  • 圖計算/機器學習/複雜時間處理

5. 當今大數據處理引擎該有的樣子

  • 強大的處理性能

性能爲王,如果數據處理性能上不去,一切都是白搭。

  • 批流一體化

即支持批處理又支持流處理,並且批處理和流處理的API能夠很好的兼容。

  • 強大的狀態管理

提供豐富的狀態管理方法,支持實現有狀態的實時流處理,保證數據處理Exactly Once語義。

  • 豐富的功能

提供豐富的接口API,能滿足日常工作中各種各樣的需求,包括但不限於機器學習、CEP、圖計算等。

 

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