數(shù)據(jù)同步利器DataX簡(jiǎn)介及如何使用
今天給大家分享一個(gè)阿里開源的數(shù)據(jù)同步工具DataX,在Github擁有14.8k的star,非常受歡迎,官網(wǎng)地址:https://github.com/alibaba/DataX
什么是 Datax?
DataX 是阿里云 DataWorks數(shù)據(jù)集成 的開源版本,使用Java 語(yǔ)言編寫,在阿里巴巴集團(tuán)內(nèi)被廣泛使用的離線數(shù)據(jù)同步工具/平臺(tái)。DataX 實(shí)現(xiàn)了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS, databend 等各種異構(gòu)數(shù)據(jù)源之間高效的數(shù)據(jù)同步功能。
應(yīng)用場(chǎng)景有那些?
- 數(shù)據(jù)倉(cāng)庫(kù)同步:DataX 可以幫助將數(shù)據(jù)從一個(gè)數(shù)據(jù)倉(cāng)庫(kù)(如關(guān)系型數(shù)據(jù)庫(kù)、大數(shù)據(jù)存儲(chǔ)系統(tǒng)等)同步到另一個(gè)數(shù)據(jù)倉(cāng)庫(kù),實(shí)現(xiàn)數(shù)據(jù)的遷移、備份或復(fù)制。
- 數(shù)據(jù)庫(kù)遷移:當(dāng)我們需要將數(shù)據(jù)從一個(gè)數(shù)據(jù)庫(kù)平臺(tái)遷移到另一個(gè)數(shù)據(jù)庫(kù)平臺(tái)時(shí),DataX 可以幫助完成數(shù)據(jù)的轉(zhuǎn)移和轉(zhuǎn)換工作
- 數(shù)據(jù)集成與同步:DataX 可以用作數(shù)據(jù)集成工具,用于將多個(gè)數(shù)據(jù)源的數(shù)據(jù)進(jìn)行整合和同步。它支持多種數(shù)據(jù)源,包括關(guān)系型數(shù)據(jù)庫(kù)、NoSQL 數(shù)據(jù)庫(kù)、文件系統(tǒng)等,可以將這些數(shù)據(jù)源的數(shù)據(jù)整合到一個(gè)目標(biāo)數(shù)據(jù)源中。
- 數(shù)據(jù)清洗與轉(zhuǎn)換:DataX 提供了豐富的數(shù)據(jù)轉(zhuǎn)換能力,可以對(duì)數(shù)據(jù)進(jìn)行清洗、過濾、映射、格式轉(zhuǎn)換等操作。這對(duì)于數(shù)據(jù)倉(cāng)庫(kù)、數(shù)據(jù)湖和數(shù)據(jù)集市等數(shù)據(jù)存儲(chǔ)和分析平臺(tái)非常有用,可以幫助提高數(shù)據(jù)質(zhì)量和一致性。
- 數(shù)據(jù)備份與恢復(fù):DataX 可以用于定期備份和恢復(fù)數(shù)據(jù)。通過配置定時(shí)任務(wù),可以將數(shù)據(jù)從源端備份到目標(biāo)端,并在需要時(shí)進(jìn)行數(shù)據(jù)恢復(fù)。
DataX支持那些數(shù)據(jù)源?
架構(gòu)設(shè)計(jì)
DataX作為離線數(shù)據(jù)同步框架,采用Framework + plugin架構(gòu)構(gòu)建。將數(shù)據(jù)源讀取和寫入抽象成為Reader/Writer插件,納入到整個(gè)同步框架中。
- Reader:Reader為數(shù)據(jù)采集模塊,負(fù)責(zé)采集數(shù)據(jù)源的數(shù)據(jù),將數(shù)據(jù)發(fā)送給Framework。
- Writer: Writer為數(shù)據(jù)寫入模塊,負(fù)責(zé)不斷向Framework取數(shù)據(jù),并將數(shù)據(jù)寫入到目的端。
- Framework:Framework用于連接reader和writer,作為兩者的數(shù)據(jù)傳輸通道,并處理緩沖,流控,并發(fā),數(shù)據(jù)轉(zhuǎn)換等核心技術(shù)問題。
DataX 開源版本支持單機(jī)多線程模式完成同步作業(yè)運(yùn)行,如下圖
- DataX完成單個(gè)數(shù)據(jù)同步的作業(yè),稱之為Job,DataX接受到一個(gè)Job之后,將啟動(dòng)一個(gè)進(jìn)程來(lái)完成整個(gè)作業(yè)同步過程。DataX Job模塊是單個(gè)作業(yè)的中樞管理節(jié)點(diǎn),承擔(dān)了數(shù)據(jù)清理、子任務(wù)切分(將單一作業(yè)計(jì)算轉(zhuǎn)化為多個(gè)子Task)、TaskGroup管理等功能。
- DataXJob啟動(dòng)后,會(huì)根據(jù)不同的源端切分策略,將Job切分成多個(gè)小的Task(子任務(wù)),以便于并發(fā)執(zhí)行。Task便是DataX作業(yè)的最小單元,每一個(gè)Task都會(huì)負(fù)責(zé)一部分?jǐn)?shù)據(jù)的同步工作。
- 切分多個(gè)Task之后,DataX Job會(huì)調(diào)用Scheduler模塊,根據(jù)配置的并發(fā)數(shù)據(jù)量,將拆分成的Task重新組合,組裝成TaskGroup(任務(wù)組)。每一個(gè)TaskGroup負(fù)責(zé)以一定的并發(fā)運(yùn)行完畢分配好的所有Task,默認(rèn)單個(gè)任務(wù)組的并發(fā)數(shù)量為5。
- 每一個(gè)Task都由TaskGroup負(fù)責(zé)啟動(dòng),Task啟動(dòng)后,會(huì)固定啟動(dòng)Reader—>Channel—>Writer的線程來(lái)完成任務(wù)同步工作。
- DataX作業(yè)運(yùn)行起來(lái)之后, Job監(jiān)控并等待多個(gè)TaskGroup模塊任務(wù)完成,等待所有TaskGroup任務(wù)完成后Job成功退出。否則,異常退出,進(jìn)程退出值非0
DataX調(diào)度流程
舉例來(lái)說(shuō),用戶提交了一個(gè)DataX作業(yè),并且配置了20個(gè)并發(fā),目的是將一個(gè)100張表的mysql數(shù)據(jù)同步到odps里面。 DataX的調(diào)度決策是:
- Job根據(jù)分表切分成了100個(gè)Task。
- 根據(jù)20個(gè)并發(fā),DataX計(jì)算需要分配4個(gè)TaskGroup。
- 4個(gè)TaskGroup平分切分好的100個(gè)Task,每一個(gè)TaskGroup負(fù)責(zé)5個(gè)并發(fā)共計(jì)運(yùn)行25個(gè)Task。
如何使用 Datax?
datax 下載
鏈接: https://pan.baidu.com/s/1QUtIAkHsHRQ9Cwna1SU5MQ?pwd=w1u6
提取碼: w1u6
datax 下載(百度網(wǎng)盤下載),下載后解壓至本地某個(gè)目錄,如下圖
用例說(shuō)明
這里為了方便演示,我們同步MySQL的user_info表至MySQL的ods_test_mysql_user_info_m,同步條件為更新時(shí)間字段,如下
在實(shí)際工作中你可以選擇不同類型的數(shù)據(jù)源測(cè)試
drop table ods_test_mysql_user_info_m CREATE TABLE `user_info` ( `id` int NOT NULL COMMENT 'ID', `name` varchar(50) NOT NULL COMMENT '名稱', `sex` tinyint NOT NULL COMMENT '性別 1男 2女', `phone` varchar(11) COMMENT '手機(jī)', `address` varchar(1000) COMMENT '地址', `age` int COMMENT '年齡', `create_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '創(chuàng)建時(shí)間', `update_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改時(shí)間', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='用戶信息表'; CREATE TABLE `ods_test_mysql_user_info_m` ( `id` int NOT NULL COMMENT 'ID', `name` varchar(50) NOT NULL COMMENT '名稱', `sex` tinyint NOT NULL COMMENT '性別 1男 2女', `phone` varchar(11) COMMENT '手機(jī)', `address` varchar(1000) COMMENT '地址', `age` int COMMENT '年齡', `create_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '創(chuàng)建時(shí)間', `update_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改時(shí)間', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='用戶信息數(shù)倉(cāng)表';
在user_info表中插入數(shù)據(jù)如下
創(chuàng)建作業(yè)的配置文件(json格式)
在 datax 的 script 目錄,創(chuàng)建ods_test_mysql_user_info_m.json
文件,配置如下,mysqlreader表示讀取端,mysqlwriter表示寫入端
{ "job": { "content": [ { "reader": { "name": "mysqlreader", "parameter": { "column": ["id","name","sex","phone","address","age","create_time","update_time"], "splitPk": "id", "connection": [ { "jdbcUrl": ["jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false"], "table": ["user_info"] } ], "password": "root", "username": "root", "where": "update_time > '${updateTime}' " } }, "writer": { "name": "mysqlwriter", "parameter": { "writeMode": "replace", "column": ["id","name","sex","phone","address","age","create_time","update_time"], "connection": [ { "jdbcUrl":"jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false", "table": ["ods_test_mysql_user_info_m"] } ], "username": "root", "password": "root", "preSql": [], "session": [ "set session sql_mode='ANSI'" ] } } } ], "setting": { "speed": { "channel": "5" } } } }
創(chuàng)建執(zhí)行腳本
為了更貼合實(shí)際,寫一個(gè)調(diào)度腳本sync.sh
支持動(dòng)態(tài)參數(shù)來(lái)執(zhí)行任務(wù)
#!/bin/bash ## 執(zhí)行示例 sh /Users/weizhao.dong/Documents/soft/datax/datax-script/call.sh /Users/weizhao.dong/Documents/soft/datax/datax-script/dwd_g2park_inout_report_s.json 1 jsonScript=$1 echo '執(zhí)行腳本:'$jsonScript interval=$2 echo "時(shí)間間隔(分鐘):"$interval now_time=$(date '+%Y-%m-%d %H:%M:%S') echo "當(dāng)前時(shí)間:"$now_time update_time=$(date -v -${interval}M '+%Y-%m-%d %H:%M:%S') #linux 更新時(shí)間獲取 #update_time=$(date -d "${now_time} $interval minute ago" +"%Y-%m-%d %H:%M:%S") echo "更新時(shí)間:"$update_time #執(zhí)行 python3 /Users/weizhao.dong/Documents/soft/datax/bin/datax.py $jsonScript -p "-DupdateTime='${update_time}'"
假設(shè)我們要執(zhí)以上ods_test_mysql_user_info_m.json
腳本,并且同步十分鐘之前的數(shù)據(jù),如下
./sync.sh ods_test_mysql_user_info_m.json 10
測(cè)試
執(zhí)行./sync.sh ods_test_mysql_user_info_m.json 10
進(jìn)行同步
以上結(jié)果可能有些人有疑問,就三條數(shù)據(jù)執(zhí)行時(shí)間為 10s,其實(shí)這個(gè) 10s主要是初始化時(shí)間,耗時(shí)過長(zhǎng),同步的數(shù)據(jù)量多了優(yōu)勢(shì)就體現(xiàn)出來(lái)了,以下為實(shí)際生產(chǎn)同步數(shù)據(jù)結(jié)果,可以看到同步63102
條耗時(shí)22s
推薦用法
以上我們只是通過一個(gè)簡(jiǎn)單的示例來(lái)演示了dataX如何使用,如果只是一次性同步,沒問題,但是如果是周期性進(jìn)行同步,有以下幾種方式推薦
crontab調(diào)度
這種方式是最簡(jiǎn)單的,可以使用操作系統(tǒng)中的crontab定時(shí)調(diào)度,通過crontab -e
編輯corn 任務(wù),添加對(duì)應(yīng)腳本即可
海豚調(diào)度器
在種方式在大數(shù)據(jù)領(lǐng)域用的比較多,典型場(chǎng)景就是 mysql 同步到數(shù)倉(cāng),海豚調(diào)度器內(nèi)置了 datax 并且提供了圖形化配置界面,配置起來(lái)非常方便
同時(shí)每次執(zhí)行都有記錄,并且都有對(duì)應(yīng)的日志
定時(shí)任務(wù)框架(elasticjob/xxl-job)
在我們實(shí)際使用的業(yè)務(wù)系統(tǒng)定時(shí)調(diào)度框架都支持調(diào)度 shell 腳本,通過傳入對(duì)應(yīng)參數(shù)也可執(zhí)行
到此這篇關(guān)于數(shù)據(jù)同步利器DataX簡(jiǎn)介及如何使用的文章就介紹到這了,更多相關(guān)DataX數(shù)據(jù)同步使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java源碼解析之String類的compareTo(String otherString)方法
這篇文章主要給大家介紹了關(guān)于java源碼解析之String類的compareTo(String otherString)方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09Windows下后端如何啟動(dòng)SpringBoot的Jar項(xiàng)目
這篇文章主要介紹了Windows下后端如何啟動(dòng)SpringBoot的Jar項(xiàng)目問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07MyBatis-Plus找不到Mapper.xml文件的幾種解決方法
mybatis-plus今天遇到一個(gè)問題,就是mybatis 沒有讀取到mapper.xml 文件,所以下面這篇文章主要給大家介紹了關(guān)于MyBatis-Plus找不到Mapper.xml文件的幾種解決方法,需要的朋友可以參考下2022-06-06Mybatis中where標(biāo)簽與if標(biāo)簽結(jié)合使用詳細(xì)說(shuō)明
mybatis中if和where用于動(dòng)態(tài)sql的條件拼接,在查詢語(yǔ)句中如果缺失某個(gè)條件,通過if和where標(biāo)簽可以動(dòng)態(tài)的改變查詢條件,下面這篇文章主要給大家介紹了關(guān)于Mybatis中where標(biāo)簽與if標(biāo)簽結(jié)合使用的詳細(xì)說(shuō)明,需要的朋友可以參考下2023-03-03springcloud使用Hystrix進(jìn)行微服務(wù)降級(jí)管理
這篇文章主要介紹了springcloud使用Hystrix進(jìn)行微服務(wù)降級(jí)管理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04解決lombok的@Data注解無(wú)法打印繼承的父類信息問題
在Java編程中,使用@Data注解可能導(dǎo)致子類繼承父類屬性后,打印只顯示子類信息不顯示父類信息,問題源于@Data注解作用域僅限于當(dāng)前類,解決方法包括使用@ToString(callSuper=true)注解或重寫toString方法2024-11-11Spring創(chuàng)建BeanDefinition之路徑掃描詳解
這篇文章主要介紹了Spring創(chuàng)建BeanDefinition之路徑掃描方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04SpringBoot利用Junit動(dòng)態(tài)代理實(shí)現(xiàn)Mock方法
說(shuō)到Spring Boot 單元測(cè)試主要有兩個(gè)主流集成分別是Mockito,Junit,這個(gè)各有特點(diǎn),在實(shí)際開發(fā)中,我想要的測(cè)試框架應(yīng)該是這個(gè)框架集成者,本文給大家介紹了SpringBoot利用Junit動(dòng)態(tài)代理實(shí)現(xiàn)Mock方法,需要的朋友可以參考下2024-04-04