柳州網站建設,十五年品牌  Tel:4006-130-670 15877267431 / 13788620417

柳州網站建設之流計算引擎數據一致性的本質

 二維碼 1
發表時間:2021-10-15 10:48

流計算的應用與實踐在大數據領域越來越常見,其重要性不言而喻,常見的流計算引擎有 Google DataFlow、Apache Flink,Apache Kafka Streams,Apache Spark Streaming 等。流計算系統中的數據一致性一般是用消息處理語義來定義的,如某引擎聲稱可以提供「恰好一次(Exactly-once Processing Semantics)流處理語義,表示(或暗示)引擎具備保證數據一致性的能力。事實上,「恰好一次(Exactly-Once)」并不等價于流計算的輸出數據就符合一致性的要求,該術語存在很多理解和使用上的誤區。

本篇文章從流計算的本質出發,重點分析流計算領域中數據處理的一致性問題,同時對一致性問題進行簡單的形式化定義,提供一個一窺當下流計算引擎發展脈絡的視角,讓大家對流計算引擎的認識更為深入,為可能的流計算技術選型提供一些參考。文章主要分為三個部分:**部分,會介紹流計算系統和一致性難題的本質;第二部分,會介紹一致性難題的通用解法以及各種方案間的取舍;第三部分,會介紹主流的流計算引擎是如何對通用解法進行泛化以實現一致性。


一   流計算中的一致性


在認識流計算系統一致性之前,我們需要精確定義流計算。流(Streaming)計算是一種在無邊界數據(unbounded data)上進行低延遲計算的數據處理過程。相應的,批計算更準確的說法是有界數據(bounded data)的處理,亦即有明確邊界的數據處理,流和批只是兩種不同數據集的傳統數據計算方法,它們并不是涇渭分明的,譬如也可以通過批量的方式(e.g. Spark Streaming 中的 micro-batch)來實現無界數據上的流處理過程。


微信圖片_20211015104836.jpg


1   一致性定義及挑戰


如果我們將流計算的過程(獲取輸入數據、處理數據、輸出計算結果)視為數據庫的主從同步過程,抑或視為一種從流數據生成衍生數據集(表)的過程,則流計算中的數據一致性同關系型數據庫事務 ACID 理論中的 Consistency 有異曲同工之妙,后者指的是在事務開始或結束時,數據庫中的記錄應該在一致狀態,相應地,流計算中的一致性可以定義為:流計算系統在計算過程中,或是出現故障恢復計算后,流系統的內部狀態和外部輸出的數據應該處在一致的狀態。譬如,當故障恢復后開始重新計算,計算的結果是否滿足數據的一致性(即用戶無法區分恢復前和恢復后的數據)?記錄是否會重復/丟失,第三方系統對同一條計算結果的多次獲取,是否會存在值上的不一致?對一致性有了清晰的認知和定義后,我們來看看為什么實現一致性這么難。

 

微信圖片_20211015104844.jpg


在定義一中我們可以看到,流計算輸入的數據是無邊界的,所以系統中會存在消息抵達流計算系統延遲、順序錯亂、數量/規模未知等不確定因素,這也是流計算系統一致性復雜性遠遠大于批處理系統的原因:批處理系統中的輸入是確定的,計算過程中可以通過計算的原子性來保證數據的一致性(如 Spark 中的 RDD 血緣)。此外,同其他分布式應用一樣,流計算系統經常也會受到各類意外因素的影響而發生故障,比如流量激增、網絡抖動、云服務資源分配出現問題等,發生故障后重新執行計算,在存在不確定輸入的前提下設計健壯的容錯機制難度很大。

除了數據輸入帶來的挑戰,流計算輸出的數據會被實時消費,類似這樣不同于批處理的應用場景,也給數據的一致性帶來的諸多挑戰,如出現 FO 后,是撤回之前發出的數據,還是是同下游進行協商實現一致性,都是需要考慮的。


2   一致性相關概念祛魅


正確認識流計算系統一致性的內在含義和其能力范疇,對我們構建正確且健壯的流計算任務至關重要。下面我會介紹幾組概念,以便于大家更好地理解流計算系統的一致性。

恰好一次≠恰好一致

今天大多數流計算引擎用「Exactly-Once」去暗示用戶:既然輸入的數據不是靜態集合而是會連續變化的,那對每一條消息「恰好處理」了一次,輸出的數據肯定是一致的。上述邏輯的推導過程是沒問題的,但并不嚴謹,因為 Exactly-Once 作為一個形容詞,后面所連接的動詞或者賓語被故意抹去了,不同的表達含義也會大相徑庭。

例子1,后接不同的動(名)詞:Exactly-once Delivery 和   Exactly-once Process 。前者是對消息傳輸層面的語義表達,和流計算的一致性關系不是很大,后者是從流計算的應用層面去描述數據處理過程。

例子2,后接不同的名詞:Exactly-once State Consistency 和 Exactly-once Process Consistency。前者是 Flink 在官網中對其一致性的敘述,后者是 Kafka Streaming 的一致性保證,前者的語義約束弱于后者。Exactly-once State Consistency 只是表達了:流計算要求對狀態的更新只提交一次到持久后端存儲,但這里的狀態一般不包括「輸出到下游結果」,而僅指引擎內部的狀態,譬如各個算子的狀態、實時流的消費偏移等,流計算引擎內部狀態變更的保證,并不能等價于從輸入到輸出的一致性,端到端一致性需要你自己關心。

總之,如何我們后面再看到 Exactly-once XXX,一定要警惕引擎想要透露出什么信息。

端到端的數據一致性

端到端一致性(End-To-Ene Consistency),即將數據的輸出也作為流計算引擎的一致性設計的一部分,正確的結果貫穿著這整個流計算應用的始終:從輸入、處理過程、輸出,每一個環節都需要保證其自身的數據一致性,同時在整個流計算流程中,作為整體實現了端到端的一致性。

下面敘述中,如果不是特意說明,一致性指的是引擎自身狀態的一致性,端到端一致指的是包含了輸出的一致性。

來源:阿里技術


15年來,我們專注于為用戶提供高品質的網站建設服務,與用戶共創未來!


會員登錄
登錄
其他帳號登錄:
留言
回到頂部
<蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>