什么是批流統(tǒng)一的高效數(shù)據(jù)同步插件—FlinkX
一、什么是FlinkX
FlinkX是一款基于Flink的分布式離線/實時數(shù)據(jù)同步插件,可實現(xiàn)多種異構(gòu)數(shù)據(jù)源高效的數(shù)據(jù)同步,其由袋鼠云于2016年初步研發(fā)完成,目前有穩(wěn)定的研發(fā)團隊持續(xù)維護,已在Github上開源(開源地址詳見文章末尾),并維護該開源社區(qū)。目前已完成批流統(tǒng)一,離線計算與流計算的數(shù)據(jù)同步任務(wù)都可基于FlinkX實現(xiàn)。
FlinkX將不同的數(shù)據(jù)源庫抽象成不同的Reader插件,目標庫抽象成不同的Writer插件,具有以下特點:
基于Flink開發(fā),支持分布式運行;
雙向讀寫,某數(shù)據(jù)庫既可以作為源庫,也可以作為目標庫;
支持多種異構(gòu)數(shù)據(jù)源,可實現(xiàn)MySQL、Oracle、SQLServer、Hive、Hbase等20多種數(shù)據(jù)源的雙向采集。
高擴展性,強靈活性,新擴展的數(shù)據(jù)源可與現(xiàn)有數(shù)據(jù)源可即時互通。

二、FlinkX應(yīng)用場景
FlinkX數(shù)據(jù)同步插件主要應(yīng)用于大數(shù)據(jù)開發(fā)平臺的數(shù)據(jù)同步/數(shù)據(jù)集成模塊,通常采用將底層高效的同步插件和界面化的配置方式相結(jié)合的方式,使大數(shù)據(jù)開發(fā)人員可簡潔、快速的完成數(shù)據(jù)同步任務(wù)開發(fā),實現(xiàn)將業(yè)務(wù)數(shù)據(jù)庫的數(shù)據(jù)同步至大數(shù)據(jù)存儲平臺,從而進行數(shù)據(jù)建模開發(fā),以及數(shù)據(jù)開發(fā)完成后,將大數(shù)據(jù)處理好的結(jié)果數(shù)據(jù)同步至業(yè)務(wù)的應(yīng)用數(shù)據(jù)庫,供企業(yè)數(shù)據(jù)業(yè)務(wù)使用。
三、FlinkX工作原理詳解
linkX基于Flink實現(xiàn),其選型及優(yōu)勢詳見
https://mp.weixin.qq.com/s/uQbGLY3_cj0h2H_PZZFRGw。FlinkX數(shù)據(jù)同步任務(wù)的本質(zhì)是一個Flink程序,讀出寫入的數(shù)據(jù)同步任務(wù)會被翻譯成StreamGraph在Flink執(zhí)行,F(xiàn)linkX開發(fā)者只需要關(guān)注InputFormat和OutputFormat接口實現(xiàn)即可。工作原理如下:

Engine是袋鼠云封裝的任務(wù)調(diào)度引擎,WEB端配置好的數(shù)據(jù)同步任務(wù)首先會提交至任務(wù)調(diào)度引擎,Template模塊根據(jù)同步任務(wù)的配置信息加載源數(shù)據(jù)庫和目標數(shù)據(jù)庫對應(yīng)的Reader和Writer插件,Reader插件實現(xiàn)InputFormat接口,從數(shù)據(jù)庫獲取DataStream對象,Writer插件實現(xiàn)OutFormat接口,將目標數(shù)據(jù)庫與DataStream對象相關(guān)聯(lián),從而通過DataStream對象將讀出寫入串接在一起,組裝成一個Flink任務(wù)提交至Flink集群上進行運行。
之前基于Flink的分片、累加器特性,解決了數(shù)據(jù)同步過程中的增量同步、多通道控制、臟數(shù)據(jù)管理與錯誤管理等場景。19年基于Flink的checkpoint機制,實現(xiàn)了斷點續(xù)傳、流數(shù)據(jù)續(xù)跑等功能,來了解一下它的新特性吧。
(1)斷點續(xù)傳
數(shù)據(jù)同步過程中,假如一個任務(wù)要同步500G的數(shù)據(jù)到目標庫,已經(jīng)跑了15min,但到400G的時候由于集群資源不夠、網(wǎng)絡(luò)等因素數(shù)據(jù)同步失敗了,若需要重頭跑此任務(wù),想必該同學要抓狂了。FlinkX基于checkpoin機制可支持斷點續(xù)傳,當同步任務(wù)由于上述原因失敗時,不需要重跑任務(wù),只需從斷點繼續(xù)同步,節(jié)省重跑時間和集群資源。
Flink的Checkpoint功能是其實現(xiàn)容錯的核心功能,它能夠根據(jù)配置周期性地對任務(wù)中的Operator/task的狀態(tài)生成快照,將這些狀態(tài)數(shù)據(jù)定期持久化存儲下來,當Flink程序一旦意外崩潰時,重新運行程序時可以有選擇地從這些快照進行恢復(fù),從而修正因為故障帶來的程序數(shù)據(jù)異常。
并且斷點續(xù)傳可和任務(wù)失敗重試機制配合,即當任務(wù)執(zhí)行失敗,系統(tǒng)會自動進行重試,若重試成功則系統(tǒng)會接著斷點位置繼續(xù)同步,從而減少人為運維。
(2)實時采集與續(xù)跑
19年6月份,袋鼠云數(shù)棧研發(fā)團隊基于FlinkX實現(xiàn)批流數(shù)據(jù)采集統(tǒng)一,可對MySQL Binlog、Filebeats、Kafka等數(shù)據(jù)源進行實時采集,并可寫入Kafka、Hive、HDFS、Greenplum等數(shù)據(jù)源,采集任務(wù)也支持作業(yè)并發(fā)數(shù)與作業(yè)速率的限制,以及臟數(shù)據(jù)管理。并基于checkpoint機制,可實現(xiàn)實時采集任務(wù)的續(xù)跑。當產(chǎn)生業(yè)務(wù)數(shù)據(jù)或Flink程序引起的采集進程中斷時,可基于Flink定期存儲的快照,對流數(shù)據(jù)的讀取節(jié)點進行保存,從而在進行故障修復(fù)時,可選擇歷史保存的數(shù)據(jù)斷點進行續(xù)跑操作,保證數(shù)據(jù)的完整性。此功能在袋鼠云的StreamWorks產(chǎn)品中實現(xiàn),歡迎大家了解。
(3)流數(shù)據(jù)的臟數(shù)據(jù)管理
之前在BatchWorks離線計算產(chǎn)品中,已實現(xiàn)離線數(shù)據(jù)同步的臟數(shù)據(jù)管理,并基于Flink的累加器實現(xiàn)臟數(shù)據(jù)的錯誤管理,當錯誤量達到配置時,置任務(wù)失敗。目前流數(shù)據(jù)實時采集也支持了此功能,即在將源庫數(shù)據(jù)寫入目標庫的過程中,將錯誤記錄進行存儲,以便后續(xù)分析數(shù)據(jù)同步過程中的臟數(shù)據(jù),并進行處理。但由于是流數(shù)據(jù)采集,任務(wù)具有不間斷性,沒有進行錯誤數(shù)記錄達到閾值的觸發(fā)任務(wù)停止操作,待后續(xù)用戶自行對臟數(shù)據(jù)分析,進行處理。
(4)數(shù)據(jù)寫入至Greenplum、OceanBase數(shù)據(jù)源
Greenplum是基于PostgreSQL的MPP數(shù)據(jù)庫,支持海量數(shù)據(jù)的存儲與管理,目前在市場上也被很多企業(yè)采用。于最近,數(shù)?;贔linkX實現(xiàn)多類型數(shù)據(jù)源寫入Greenplum,除全量同步外,也支持部分數(shù)據(jù)庫增量同步寫入。OceanBase是阿里研發(fā)的一款可擴展的金融領(lǐng)域關(guān)系型數(shù)據(jù)庫,其用法與MySQL基本一致,實現(xiàn)OceanBase的數(shù)據(jù)讀入寫出也是基于jdbc的連接方式,進行數(shù)據(jù)表與字段的同步與寫入,也支持對OceanBase進行增量寫入,以及作業(yè)同步通道、并發(fā)的控制。
寫入Greenplum等關(guān)系數(shù)據(jù)庫時,默認是不使用事務(wù)的,因為數(shù)據(jù)量特別大的情況下,一旦任務(wù)失敗,就會對業(yè)務(wù)數(shù)據(jù)庫產(chǎn)生巨大的影響。但是在開啟斷點續(xù)傳的時候必須開啟事務(wù),如果數(shù)據(jù)庫不支持事務(wù),則無法實現(xiàn)斷點續(xù)傳的功能。開啟斷點續(xù)傳時,會在Flink生成快照的時候提交事務(wù),把當前的數(shù)據(jù)寫入數(shù)據(jù)庫,如果兩次快照期間任務(wù)失敗了,則這次事務(wù)里的數(shù)據(jù)不會寫入數(shù)據(jù)庫,任務(wù)恢復(fù)時從上一次快照記錄的位置繼續(xù)同步數(shù)據(jù),這樣就可以做到任務(wù)多次失敗續(xù)跑的情況下準確的同步數(shù)據(jù)。
四、寫在后面
FlinkX經(jīng)過袋鼠云內(nèi)部使用以及在大量的數(shù)據(jù)中臺項目中實踐,支持以下數(shù)據(jù)源。且在FlinkX的高擴展特性下,將持續(xù)支撐更多的數(shù)據(jù)源。

數(shù)棧是云原生—站式數(shù)據(jù)中臺PaaS,我們在github和gitee上有一個有趣的開源項目:FlinkX,F(xiàn)linkX是一個基于Flink的批流統(tǒng)一的數(shù)據(jù)同步工具,既可以采集靜態(tài)的數(shù)據(jù),也可以采集實時變化的數(shù)據(jù),是全域、異構(gòu)、批流一體的數(shù)據(jù)同步引擎。大家喜歡的話請給我們點個star!star!star!
github開源項目:https://github.com/DTStack/flinkx
gitee開源項目:https://gitee.com/dtstack_dev_0/flinkx