自動同步整個 MySQL/Oracle 資料庫以進行資料分析

資料庫工作筆記發表於2023-10-13

來源:大資料雜貨鋪

自動同步整個 MySQL/Oracle 資料庫以進行資料分析

Flink-Doris-Connector 1.4.0 允許使用者一步將包含數千個表的整個資料庫(MySQL或Oracle )攝取到Apache Doris(一種實時分析資料庫)中。
透過內建的Flink CDC,聯結器可以直接將上游源的表模式和資料同步到Apache Doris,這意味著使用者不再需要編寫DataStream程式或在Doris中預先建立對映表。

當 Flink 作業啟動時,Connector 會自動檢查源資料庫和 Apache Doris 之間的資料等效性。如果資料來源包含 Doris 中不存在的表,Connector 會自動在 Doris 中建立相同的表,並利用 Flink 的側輸出來方便一次攝取多個表;如果源中發生架構更改,它將自動獲取 DDL 語句並在 Doris 中進行相同的架構更改。

一、快速開始

  • 對於MySQL:

下載 JAR 檔案:


行家:








<dependency><groupId>org.apache.doris</groupId><artifactId>flink-doris-connector-1.15</artifactId><!--artifactId>flink-doris-connector-1.16</artifactId--><!--artifactId>flink-doris-connector-1.17</artifactId--><version>1.4.0</version></dependency>

  • 對於Oracle:

下載 JAR 檔案:
Flink 1.15

Flink 1.16
Flink 1.17

如何使用它
例如,要將整個 MySQL 資料庫引入mysql_dbDoris(MySQL 表名以tbl或test開頭),只需執行以下命令(無需提前在Doris 中建立表):


















<FLINK_HOME>/bin/flink run \-Dexecution.checkpointing.interval=10s \-Dparallelism.default=1 \-c org.apache.doris.flink.tools.cdc.CdcTools \lib/flink-doris-connector-1.16-1.4.0.jar \mysql-sync-database \--database test_db \--mysql-conf hostname=127.0.0.1 \--mysql-conf username=root \--mysql-conf password=123456 \--mysql-conf database-name=mysql_db \--including-tables "tbl|test.*" \--sink-conf fenodes=127.0.0.1:8030 \--sink-conf username=root \--sink-conf password=123456 \--sink-conf jdbc-url=jdbc:mysql://127.0.0.1:9030 \--sink-conf sink.label-prefix=label1 \--table-conf replication_num=1

攝取Oracle資料庫:請參考示例程式碼()。

表現如何
當涉及到同步整個資料庫(包含數百甚至數千個活動或不活動的表)時,大多數使用者希望在幾秒鐘內完成。因此我們測試了聯結器,看看它是否符合要求:

  • 1000 個 MySQL 表,每個表有 100 個欄位。所有表都是活動的(這意味著它們不斷更新,每次資料寫入涉及一百多行)
  • Flink作業檢查點:10s

經過壓力測試,系統表現出較高的穩定性,主要指標如下:

自動同步整個 MySQL/Oracle 資料庫以進行資料分析

自動同步整個 MySQL/Oracle 資料庫以進行資料分析
自動同步整個 MySQL/Oracle 資料庫以進行資料分析

根據早期採用者的反饋,該Connector在生產環境中的萬表資料庫同步中也提供了高效能和系統穩定性。這證明Apache Doris和Flink CDC的結合能夠高效可靠地進行大規模資料同步。

二、它如何使資料工程師受益
工程師不再需要擔心表建立或表模式維護,從而節省了數天繁瑣且容易出錯的工作。之前在Flink CDC中,需要為每個表建立一個Flink作業,並在源端建立日誌解析鏈路,但現在透過全庫攝取,源資料庫的資源消耗大大減少。也是增量更新和全量更新的統一解決方案。
其他特性
1、連線維度表和事實表
常見的做法是將維度表放在Doris中,透過Flink的實時流進行Join查詢。Flink-Doris-Connector 1.4.0基於Flink 的 Async I/O實現了非同步 Lookup Join,因此 Flink 實時流不會因為查詢而阻塞。此外,聯結器還允許您將多個查詢合併為一個大查詢,並將其立即傳送給 Doris 進行處理。這提高了此類連線查詢的效率和吞吐量。

2、節儉 SDK

我們在 Connector 中引入了 Thrift-Service SDK,使用者不再需要使用 Thrift 外掛或在編譯時配置 Thrift 環境。這使得編譯過程變得更加簡單。

3、按需流載入

資料同步過程中,當沒有新的資料攝入時,不會發出Stream Load請求。這樣可以避免不必要的叢集資源消耗。

4、後端節點輪詢

對於資料攝取,Doris 呼叫前端節點獲取後端節點列表,並隨機選擇一個發起攝取請求。該後端節點將是協調器。Flink-Doris-Connector 1.4.0 允許使用者啟用輪詢機制,即在每個Flink 檢查點都有不同的後端節點作為 Coordinator,以避免單個後端節點長期承受過大的壓力。

5、支援更多資料型別

除了常見的資料型別外,Flink-Doris-Connector 1.4.0 還支援 Doris 中的 DecimalV3/DateV2/DateTimev2/Array/JSON。

三、用法示例
可以透過DataStream或FlinkSQL(有界流)從Doris讀取資料。支援謂詞下推。















CREATE TABLE flink_doris_source (   name STRING,   age INT,   score DECIMAL(5,2)  )    WITH (     'connector' = 'doris',     'fenodes' = '127.0.0.1:8030',     'table.identifier' = 'database.table',     'username' = 'root',     'password' = 'password',     'doris.filter.query' = 'age=18');
SELECT * FROM flink_doris_source;


連線維度表和事實表:






























CREATE TABLE fact_table ( `id` BIGINT, `name` STRING, `city` STRING, `process_time` as proctime()) WITH ( 'connector' = 'kafka',...);
create table dim_city( `city` STRING, `level` INT , `province` STRING, `country` STRING) WITH ( 'connector' = 'doris', 'fenodes' = '127.0.0.1:8030', 'jdbc-url' = 'jdbc:mysql://127.0.0.1:9030', 'lookup.jdbc.async' = 'true', 'table.identifier' = 'dim.dim_city', 'username' = 'root', 'password' = '');
SELECT a.id, a.name, a.city, c.province, c.country,c.level FROM fact_table aLEFT JOIN dim_city FOR SYSTEM_TIME AS OF a.process_time AS cON a.city = c.city


寫入Apache Doris:

















CREATE TABLE doris_sink (   name STRING,   age INT,   score DECIMAL(5,2)  )    WITH (     'connector' = 'doris',     'fenodes' = '127.0.0.1:8030',     'table.identifier' = 'database.table',     'username' = 'root',     'password' = '',     'sink.label-prefix' = 'doris_label',     //json write in     'sink.properties.format' = 'json',     'sink.properties.read_json_by_line' = 'true');


原文作者:ApacheDoris

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

相關文章