超越Storm,SparkStreaming——Flink如何實現有狀態的計算

来源:https://www.cnblogs.com/tree1123/archive/2019/09/03/11454482.html
-Advertisement-
Play Games

流式計算分為無狀態和有狀態兩種情況。無狀態計算觀察每個獨立的事件,Storm就是無狀態的計算框架,每一條消息來了以後和前後都沒有關係,一條是一條。比如我們接收電力系統感測器的數據,當電壓超過240v就報警,這就是無狀態的數據。但是如果我們需要同時判斷多個電壓,比如三相電路,我們判斷三相電都高於某個值 ...


file

流式計算分為無狀態和有狀態兩種情況。無狀態計算觀察每個獨立的事件,Storm就是無狀態的計算框架,每一條消息來了以後和前後都沒有關係,一條是一條。比如我們接收電力系統感測器的數據,當電壓超過240v就報警,這就是無狀態的數據。但是如果我們需要同時判斷多個電壓,比如三相電路,我們判斷三相電都高於某個值,那麼就需要將狀態保存,計算。因為這三條記錄是分別發送過來的。

file

Storm需要自己實現有狀態的計算,比如藉助於自定義的記憶體變數或者redis等系統,保證低延遲的情況下自己去判斷實現有狀態的計算,但是Flink就不需要這樣,而且作為新一代的流處理系統,Flink非常重視。

一致性

其實就是消息傳遞的正確性。在流處理中,一致性分為 3 個級別。

  • at-most-once:最多一次,可能會丟失。

  • at-least-once:最少一次,可能會重覆,而計算的時候可能就會多次運算影響結果。

  • exactly-once:恰好保證一次,這樣得到的結果是最準確的。

最先保證 exactly-once 的系統(Storm Trident 和 Spark Streaming),但是在性能和表現力這兩個方面付出了很大的代價。為了保證 exactly-once,這些系統無法單獨地對每條記錄運用應用邏輯,而是同時處理多條(一批)記錄,保證對每一批的處理要麼全部成功,要麼全部失敗。這就導致在得到結果前, 必須等待一批記錄處理結束。因此,用戶經常不得不使用兩個流處理框架 (一個用來保證 exactly-once,另一個用來對每個元素做低延遲處理),結果使基礎設施更加複雜。

但是,Flink解決了這種問題。

檢查點機制

檢查點是 Flink 最有價值的創新之一,因為它使 Flink 可以保 證 exactly-once,並且不需要犧牲性能。

Flink 檢查點的核心作用是確保狀態正確,即使遇到程式中斷,也要正確。 記住這一基本點之後,我們用一個例子來看檢查點是如何運行的。Flink 為 用戶提供了用來定義狀態的工具。例如,以下這個 Scala 程式按照輸入記錄 的第一個欄位(一個字元串)進行分組並維護第二個欄位的計數狀態。

val stream: DataStream[(String, Int)] = ... 
 
val counts: DataStream[(String, Int)] = stream   
.keyBy(record => record._1)   
.mapWithState((in: (String, Int), count: Option[Int]) =>     
  count match {       
    case Some(c) => ( (in._1, c + in._2), Some(c + in._2) )       
    case None => ( (in._1, in._2), Some(in._2) )     
})

該程式有兩個運算元:keyBy 運算元用來將記錄按照第一個元素(一個字元串) 進行分組,根據該 key 將數據進行重新分區,然後將記錄再發送給下一個運算元:有狀態的 map 運算元(mapWithState)。 map 運算元在接收到每個元素後, 將輸入記錄的第二個欄位的數據加到現有總數中,再將更新過的元素髮射出去。

file

輸入流中的 6 條記錄被檢查點屏障 (checkpoint barrier)隔開,所有的 map 運算元狀態均為0(計數還未開始)。 所有 key 為 a 的記錄將被頂層的 map 運算元處理,所有 key 為 b 的記錄將被中間層的 map 運算元處理,所有 key 為 c 的記錄則將被底層的 map 運算元處理。

如果輸入流來自消息傳輸系統Kafka,這個相互隔離的位置就是偏移量。

file

檢查點屏障像普通記錄一樣在運算元之間流動。當 map 運算元處理完前 3 條記錄 並收到檢查點屏障時,它們會將狀態以非同步的方式寫入穩定存儲.

file

當沒有出現故障時,Flink 檢查點的開銷極小,檢查點操作的速度由穩定存儲的可用帶寬決定。

如果檢查點操作失敗,Flink 會丟棄該檢查點並繼續正常執行,因為之後的 某一個檢查點可能會成功。

file

在這種情況下,Flink 會重新拓撲(可能會獲取新的執行資源),將輸入流 倒回到上一個檢查點,然後恢復狀態值並從該處開始繼續計算。

file

Flink 將輸入流倒回到上一個檢查點屏障的位置,同時恢復 map 運算元的狀態值。 然後,Flink 從此處開始重新處理。這樣做保證了在記錄被處理之後,map 運算元的狀 態值與沒有發生故障時的一致.

Flink 檢查點演算法的正式名稱是非同步屏障快照(asynchronous barrier snapshotting)。

保存點

狀態版本控制

檢查點由 Flink 自動生成,用來在故障發生時重新處理記錄,從而修正狀 態。Flink 用戶還可以通過另一個特性有意識地管理狀態版本,這個特性叫作保存點(savepoint)。

保存點與檢查點的工作方式完全相同,只不過它由用戶通過 Flink 命令行工 具或者 Web 控制台手動觸發,而不由 Flink 自動觸發,用戶可以從保存點重啟作業,而不用從頭開始。對保存點的另一種理解是,它在明確的時間點保存應用程式狀態的版本。

file

在圖中,v.0 是某應用程式的一個正在運行的版本。我們分別在 t1 時刻和 t2 時刻觸發了保存點。因此,可以在任何時候返回到這兩個時間點,並且重 啟程式。更重要的是,可以從保存點啟動被修改過的程式版本。舉例來說, 可以修改應用程式的代碼(假設稱新版本為 v.1),然後從t1 時刻開始運行 改動過的代碼。

file

使用保存點更新Flink 應用程式的版本。新版本可以從舊版本生成的一個 保存點處開始執行.

端到端的一致性

file

在該應用程式架構中,有狀態的Flink 應用程式消費來自消息隊列的數據, 然後將數據寫入輸出系統,以供查詢。

輸入數據來自Kafka,在將狀態內容傳送到輸出存儲系統的過程中,如何保證 exactly-once 呢?這 叫作端到端的一致性。本質上有兩種實現方法,用哪一種方法則取決於輸 出存儲系統的類型,以及應用程式的需求。

(1) 第一種方法是在 sink 環節緩衝所有輸出,併在 sink 收到檢查點記錄時, 將輸出“原子提交”到存儲系統。這種方法保證輸出存儲系統中只存在 有一致性保障的結果,並且不會出現重覆的數據。從本質上說,輸出存 儲系統會參與 Flink 的檢查點操作。要做到這一點,輸出存儲系統需要 具備“原子提交”的能力。

(2) 第二種方法是急切地將數據寫入輸出存儲系統,同時牢記這些數據可能 是“臟”的,而且需要在發生故障時重新處理。如果發生故障,就需要將 輸出、輸入和 Flink 作業全部回滾,從而將“臟”數據覆蓋,並將已經寫 入輸出的“臟”數據刪除。註意,在很多情況下,其實並沒有發生刪除 操作。例如,如果新記錄只是覆蓋舊紀錄(而不是添加到輸出中),那麼 “臟”數據只在檢查點之間短暫存在,並且最終會被修正過的新數據覆蓋。

根據輸出存儲系統的類型,Flink 及與之對應的連接器可以一起保證端到端 的一致性,並且支持多種隔離級別。

更多Flink相關文章:

Streaming-大數據的未來

實時計算大數據處理的基石-Google Dataflow

數據架構的未來——淺談流處理架構

穿梭時空的實時計算框架——Flink對時間的處理

Flink快速入門--安裝與示例運行

大數據實時處理的王者-Flink

更多實時計算,Flink,Kafka等相關技術博文,歡迎關註實時流式計算:

file


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、數據挖掘 中文分詞 • 一段文字不僅僅在於字面上是什麼,還在於怎麼切分和理解。• 例如: – 阿三炒飯店: – 阿三 / 炒飯 / 店 阿三 / 炒 / 飯店• 和英文不同,中文詞之間沒有空格,所以實現中文搜索引擎,比英文多了一項分詞的任務。• 如果沒有中文分詞會出現: – 搜索“達內”,會出現 ...
  • 公司一SQL Server鏡像發生了故障轉移(主備切換),檢查SQL Server鏡像發生主備切換的原因,在錯誤日誌中發現下麵錯誤: Date 2019/8/31 14:09:17 Log SQL Server (Archive #4 - 2019/9/1 0:00:00) Source spid3... ...
  • redis是key-value的數據,所以每個數據都是一個鍵值對。 數據操作的全部命令,可以查看中文網站。 鍵的類型是字元串 值的類型分為五種: 字元串string 哈希hash 列表list 集合set 有序集合zset 字元串string 哈希hash 列表list 集合set 有序集合zset ...
  • 1.獨立模式(standalone|local) nothing! 本地文件系統。 不需要啟用單獨進程。 2.pesudo(偽分佈模式) 等同於完全分散式,只有一個節點。 SSH: //(Socket), //public + private /server : sshd ps -Af | grep ...
  • SELECT select的完整語法: 上述如果都有:執行順序from->where->group by->having->order by->limit->select 列的結果顯示 1、去掉重覆的數據:distinct(針對於記錄而言,不是針對於列的數據而言) 2、運算符:+、-、*、/、%(只 ...
  • 1.一個問題 InnoDB一棵B+樹可以存放多少行數據?這個問題的簡單回答是:約2千萬。為什麼是這麼多呢?因為這是可以算出來的,要搞清楚這個問題,我們先從InnoDB索引數據結構、數據組織方式說起。 我們都知道電腦在存儲數據的時候,有最小存儲單元,這就好比我們今天進行現金的流通最小單位是一毛。在計 ...
  • 定義 各類別的出現概率不均衡的情況 如信用風險中正常用戶遠多於逾期、違約用戶;流失風險中留存用戶多於流失用戶 隱患 降低對少類樣本的靈敏性。但我們建模就是要找到這少類樣本,所以必須對數據加以處理,來提高靈敏性。 解決方案 1. 過採樣 對壞的人群提高權重,即複製壞樣本,提高壞樣本的占比。 優點: 簡 ...
  • 前面說到了 Flink的TaskManager啟動(源碼分析) 啟動了TaskManager 然後 Flink的Job啟動JobManager端(源碼分析) 說到JobManager會將轉化得到的TDD發送到TaskManager的RPC 這篇主要就講一下,Job在TaskManager端是如何啟動 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...