FlinkX—批流統一的高效數據同步插件

什麼是FlinkX?

FlinkX是一款基於Flink的分佈式離線/實時數據同步插件,可實現多種異構數據源高效的數據同步,其由袋鼠雲於2016年初步研發完成,目前有穩定的研發團隊持續維護,已在Github上開源(開源地址詳見文章末尾)。並於今年6年份,完成批流統一,離線計算與流計算的數據同步任務都可基於FlinkX實現。

FlinkX將不同的數據源庫抽象成不同的Reader插件,目標庫抽象成不同的Writer插件,具有以下特點:

  1. 基於Flink開發,支持分佈式運行;
  2. 雙向讀寫,某數據庫既可以作爲源庫,也可以作爲目標庫;
  3. 支持多種異構數據源,可實現MySQL、Oracle、SQLServer、Hive、Hbase等近20種數據源的雙向採集。
  4. 高擴展性,強靈活性,新擴展的數據源可與現有數據源可即時互通。

 

 

FlinkX應用場景

FllikX數據同步插件主要應用於大數據開發平臺的數據同步/數據集成模塊,通常採用將底層高效的同步插件和界面化的配置方式相結合的方式,使大數據開發人員可簡潔、快速的完成數據同步任務開發。實現將業務數據庫的數據同步至大數據存儲平臺,從而進行數據建模開發,以及數據開發完成後,將大數據處理好的結果數據同步至業務的應用數據庫,供企業數據業務使用。

 

FlinkX工作原理詳解

FlinkX基於Flink實現,其選型及優勢詳見https://mp.weixin.qq.com/s/uQbGLY3_cj0h2H_PZZFRGw。FlinkX數據同步任務的本質是一個Flink程序,讀出寫入的數據同步任務會被翻譯成StreamGraph在Flink執行,FlinkX開發者只需要關注InputFormat和OutputFormat接口實現即可。工作原理如下:

 

Engine是袋鼠雲封裝的任務調度引擎,WEB端配置好的數據同步任務首先會提交至任務調度引擎,Template模塊根據同步任務的配置信息加載源數據庫和目標數據庫對應的Reader和 Writer插件,Reader插件實現InputFormat接口,從數據庫獲取DataStream對象,Writer插件實現OutFormat接口,將目標數據庫與DataStream對象相關聯,從而通過DataStream對象將讀出寫入串接在一起,組裝成一個Flink任務提交至Flink集羣上進行運行。

之前基於Flink的分片、累加器特性,解決了數據同步過程中的增量同步、多通道控制、髒數據管理與錯誤管理等場景。最近半年基於Flink的checkpoint機制,實現了斷點續傳、流數據續跑等功能,來了解一下它的新特性吧。

(1)斷點續傳

數據同步過程中,假如一個任務要同步500G的數據到目標庫,已經跑了15min,但到400G的時候由於集羣資源不夠、網絡等因素數據同步失敗了,若需要重頭跑此任務,想必該同學要抓狂了。FlinkX基於checkpoin機制可支持斷點續傳,當同步任務由於上述原因失敗時,不需要重跑任務,只需從斷點繼續同步,節省重跑時間和集羣資源。

Flink的Checkpoint功能是其實現容錯的核心功能,它能夠根據配置週期性地對任務中的Operator/task的狀態生成快照,將這些狀態數據定期持久化存儲下來,當Flink程序一旦意外崩潰時,重新運行程序時可以有選擇地從這些快照進行恢復,從而修正因爲故障帶來的程序數據異常。

並且斷點續傳可和任務失敗重試機制配合,即當任務執行失敗,系統會自動進行重試,若重試成功則系統會接着斷點位置繼續同步,從而減少人爲運維。

(2)實時採集與續跑

今年6月份,袋鼠雲數棧研發團隊基於FlinkX實現批流數據採集統一,可對MySQL Binlog、Filebeats、Kafka等數據源進行實時採集,並可寫入Kafka、Hive、HDFS、Greenplum等數據源,採集任務也支持作業併發數與作業速率的限制,以及髒數據管理。並基於checkpint機制,可實現實時採集任務的續跑。當產生業務數據或Flink程序引起的採集進程中斷時,可基於Flink定期存儲的快照,對流數據的讀取節點進行保存,從而在進行故障修復時,可選擇歷史保存的數據斷點進行續跑操作,保證數據的完整性。此功能在袋鼠雲的StreamWorks產品中實現,歡迎大家瞭解。

(3)流數據的髒數據管理

之前在BatchWorks離線計算產品中,已實現離線數據同步的髒數據管理,並基於Flink的累加器實現髒數據的錯誤管理,當錯誤量達到配置時,置任務失敗。目前流數據實時採集也支持了此功能,即在將源庫數據寫入目標庫的過程中,將錯誤記錄進行存儲,以便後續分析數據同步過程中的髒數據,並進行處理。但由於是流數據採集,任務具有不間斷性,沒有進行錯誤數記錄達到閾值的觸發任務停止操作,待後續用戶自行對髒數據分析,進行處理。

(4)數據寫入至Greenplum、Oceanbase數據源

Greenplum是基於PostgreSQL的MPP數據庫,支持海量數據的存儲與管理,目前在市場上也被很多企業採用。於最近,數棧基於FlinkX實現多類型數據源寫入Greenplum,除全量同步外,也支持部分數據庫增量同步寫入。OceanBase是阿里研發的一款可擴展的金融領域關係型數據庫,其用法與MySQL基本一致,實現OceanBase的數據讀入寫出也是基於jdbc的連接方式,進行數據表與字段的同步與寫入,也支持對OceanBase進行增量寫入,以及作業同步通道、併發的控制。

寫入Greenplum等關係數據庫時,默認是不使用事務的,因爲數據量特別大的情況下,一旦任務失敗,就會對業務數據庫產生巨大的影響。但是在開啓斷點續傳的時候必須開啓事務,如果數據庫不支持事務,則無法實現斷點續傳的功能。開啓斷點續傳時,會在Flink生成快照的時候提交事務,把當前的數據寫入數據庫,如果兩次快照期間任務失敗了,則這次事務裏的數據不會寫入數據庫,任務恢復時從上一次快照記錄的位置繼續同步數據,這樣就可以做到任務多次失敗續跑的情況下準確的同步數據。

若需瞭解具體技術實現,詳見https://mp.weixin.qq.com/s/VknlH8L2kpnlcJ3990ZkUw

 

寫在後面:

FlinkX經過袋鼠雲內部使用以及在大量的數據中臺項目中實踐,目前支持以下數據源。且在FlinkX的高擴展特性下,將持續支撐更多的數據源,滿足不同企業的需要,目前正在研發Clickhouse、Hana等數據源。

 

FlinkX開源地址:https://github.com/DTStack/flinkx  ,希望該項關注大數據平臺研的開員帶來便利,也歡迎大家共同貢獻對數據同步技術的智慧與熱情。

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