DataPipeline CTO陳肅:構建批流一體資料融合平臺的一致性語義保證

DataPipeline發表於2020-02-13


文 | 陳肅 DataPipelineCTO


首先,本文將從資料融合角度,談一下DataPipeline對批流一體架構的看法,以及如何設計和使用一個基礎框架。 其次,資料的一致性是進行資料融合時最基礎的問題。 如果資料無法實現一致,即使同步再快,支援的功能再豐富,都沒有意義。


另外,DataPipeline目前使用的基礎框架為Kafka Connect。為實現一致性的語義保證,我們做了一些額外工作,希望對大家有一定的參考意義。

最後,會提一些我們在應用Kafka Connect框架時,遇到的一些現實的工程問題,以及應對方法。儘管大家的場景、環境和資料量級不同,但也有可能會遇到這些問題。希望對大家的工作有所幫助。




一、批流一體架構


批和流是資料融合的兩種應用形態

下圖來自Flink官網。傳統的資料融合通常基於批模式。在批的模式下,我們會透過一些週期性執行的ETL JOB,將資料從關係型資料庫、檔案儲存向下遊的目標資料庫進行同步,中間可能有各種型別的轉換。




另一種是Data Pipeline模式。與批模式相比相比, 其最核心的區別是將批次變為實時:輸入的資料不再是週期性的去獲取,而是源源不斷的來自於資料庫的日誌、訊息佇列的訊息。進而透過一個實時計算引擎,進行各種聚合運算,產生輸出結果,並且寫入下游。

 
現代的一些處理框架,包括Flink、Kafka Streams、Spark,或多或少都能夠支援批和流兩種概念。只不過像Kafka,其原生就是為流而生,所以如果基於Kafka Connect做批流一體,你可能需要對批次的資料處理做一些額外工作,這是我今天重點要介紹的。


資料融合的基本問題


如果問題簡化到你只有一張表,可能是一張MySQL的表,裡面只有幾百萬行資料,你可能想將其同步到一張Hive表中。基於這種情況,大部分問題都不會遇到。因為結構是確定的,資料量很小,且沒有所謂的並行化問題。




但在一個實際的企業場景下,如果做一個資料融合系統,就不可避免要面臨幾方面的挑戰:


第一,“動態性”

資料來源會不斷地發生變化,主要歸因於:表結構的變化,表的增減。針對這些情況,你需要有一些相應的策略進行處理。

第二,“可伸縮性”

任何一個分散式系統,必須要提供可伸縮性。因為你不是隻同步一張表,通常會有大量資料同步任務在進行著。如何在一個叢集或多個叢集中進行統一的排程,保證任務並行執行的效率,這是一個要解決的基本問題。

第三,“容錯性”

在任何環境裡你都不能假定伺服器是永遠在正常執行的,網路、磁碟、記憶體都有可能發生故障。這種情況下一個Job可能會失敗,之後如何進行恢復?狀態能否延續?是否會產生資料的丟失和重複?這都是要考慮的問題。

第四,“異構性”

當我們做一個資料融合專案時,由於源和目的地是不一樣的,比如,源是MySQL,目的地是Oracle,可能它們對於一個欄位型別定義的標準是有差別的。在同步時,如果忽略這些差異,就會造成一系列的問題。

第五,“一致性”

一致性是資料融合中最基本的問題,即使不考慮資料同步的速度,也要保證資料一致。資料一致性的底線為:資料先不丟,如果丟了一部分,通常會導致業務無法使用;在此基礎上更好的情況是:源和目的地的資料要完全一致,即所謂的端到端一致性,如何做到呢? 

Lambda架構是批流一體化的必然要求

目前在做這樣的平臺時,業界比較公認的有兩種架構:一種是Lambda架構,Lambda架構的核心是按需使用批次和流式的處理框架,分別針對批式和流式資料提供相應的處理邏輯。最終透過一個服務層進行對外服務的輸出。

為什麼我們認為Lambda架構是批流一體化的必然要求?這好像看起來是矛盾的(與之相對,還有一種架構叫Kappa架構,即用一個流式處理引擎解決所有問題)。


實際上,這在很大程度來自於現實中使用者的需求。DataPipeline在剛剛成立時只有一種模式,只支援實時流同步,在我們看來這是未來的一種趨勢。

但後來發現,很多客戶實際上有批次同步的需求。比如,銀行在每天晚上可能會有一些月結、日結,證券公司也有類似的結算服務。基於一些歷史原因,或出於對效能、資料庫配置的考慮,可能有的資料庫本身不能開change log。所以實際上並不是所有情況下都能從源端獲取實時的流資料。


考慮到上述問題,我們認為一個產品在支撐資料融合過程中,必須能同時支撐批次和流式兩種處理模式,且在產品裡面出於效能和穩定性考慮提供不同的處理策略,這才是一個相對來說比較合理的基礎架構。


資料融合的Ad-Hoc模式


具體到做這件事,還可以有兩種基礎的應用模式。假如我需要將資料從MySQL同步到 Hive,可以直接建立一個ETL的JOB(例如基於Flink),其中封裝所有的處理邏輯,包括從源端讀取資料,然後進行變換寫入目的地。在將程式碼編譯好以後,就可以放到Flink叢集上執行,得到想要的結果。這個叢集環境可以提供所需要的基礎能力,剛才提到的包括分散式,容錯等。


 
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31556703/viewspace-2675376/,如需轉載,請註明出處,否則將追究法律責任。

相關文章