概述
DataX 是阿裡巴巴集團内被廣泛使用的離線資料同步工具/平台,實作包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各種異構資料源之間高效的資料同步功能。
阿裡雲已經開源此工具,目前版本是datax3.0。
下載下傳安裝
下載下傳
Githup位址:
https://github.com/alibaba/DataX若是有能力就直接在伺服器上Git clone 或者直接點選【Clone or download】下載下傳datax的源碼包,需要自己手動去編譯
是以我選擇将該網頁往下拉一點,點選

直接下載下傳編譯好的安裝包
伺服器配置
我使用的是阿裡雲上的ECS-centos部署datax,總的來說要滿足以下幾點:
- JDK(1.8以上,推薦1.8)
- Python(推薦Python2.6.X)
- Apache Maven 3.x (Compile DataX)
1、我先安裝JDK
使用yum安裝
# yum search java|grep jdk
# yum install java-1.8.0-openjdk -y
安裝完成之後可以檢視下安裝的版本
[root@stephen ~]# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
2、Python
一般的centos都是自帶Python的
[root@stephen ~]# python --version
Python 2.7.5
3、 Apache Maven 3.x
下載下傳位址:
https://maven.apache.org/download.cgi我下載下傳的是3.6.1版本,上傳到伺服器中bin解壓
[root@stephen ~]# ls
apache-maven-3.6.1-bin.tar.gz
[root@stephen ~]# tar -xvzf apache-maven-3.6.1-bin.tar.gz
為了友善,建立一個目錄
[root@stephen ~]# mkdir /opt/maven
[root@stephen ~]# mv apache-maven-3.6.1/* /opt/maven/
[root@stephen maven]# ln -s /opt/maven/bin/mvn /usr/bin/mvn
在vi /etc/profile.d/maven.sh添加
export M2_HOME=/opt/maven
export PATH=${M2_HOME}/bin:${PATH}
建立完成後看看版本
[root@stephen maven]# mvn -v
Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T03:00:29+08:00)
Maven home: /opt/maven
Java version: 1.8.0_222, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-0.el7_6.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-514.26.2.el7.x86_64", arch: "amd64", family: "unix"
至此,伺服器配置完成
開始安裝
将下載下傳的datax包上傳到伺服器并解壓
[root@stephen opt]# tar -xvzf datax.tar.gz
[root@stephen opt]# ls datax
bin conf job lib log log_perf plugin script tmp
如果下載下傳的是編譯好的安裝包的話,基本上就是已經安裝好了。可以使用自檢測試腳本進行測試一下
python {YOUR_DATAX_HOME}/bin/datax.py {YOUR_DATAX_HOME}/job/job.json
當測試顯示以下内容是,說明datax已經安裝成功
[root@stephen datax]# python bin/datax.py job/job.json
DataX (DATAX-OPENSOURCE-3.0), From Alibaba !
Copyright (C) 2010-2017, Alibaba Group. All Rights Reserved.
.....顯示省略.....
2019-08-21 12:08:36.709 [job-0] INFO JobContainer -
任務啟動時刻 : 2019-08-21 12:08:26
任務結束時刻 : 2019-08-21 12:08:36
任務總計耗時 : 10s
任務平均流量 : 253.91KB/s
記錄寫入速度 : 10000rec/s
讀出記錄總數 : 100000
讀寫失敗總數 : 0
測試使用
測試環境:阿裡雲ECS 自建 MySQL 5.7 與PostgreSQL 11.2 資料庫
計劃從MySQL中同步一張表的10萬行資料 到 PostgreSQL資料庫中,具體情況如下:
準備資料
mysql中的原表結構
mysql> show create table datax_test;
| Table | Create Table |
| datax_test | CREATE TABLE `datax_test` (
`id` int(11) NOT NULL,
`name` varchar(20) DEFAULT NULL,
`birthday` date DEFAULT NULL,
`memo` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
用資料工具生成了10萬行資料
mysql> select count(*) from datax_test;
+----------+
| count(*) |
+----------+
| 100000 |
+----------+
在Postgresql資料庫中先建好相同結構的表。字段類型要做相應轉換,如下:
stephen=# \d datax_test
Table "public.datax_test"
Column | Type | Collation | Nullable | Default
----------+--------------------------------+-----------+----------+-----------------------------------
id | integer | | not null |
name | text | | |
birthday | timestamp(0) without time zone | | | NULL::timestamp without time zone
memo | text | | |
Indexes:
"datax_test_pkey" PRIMARY KEY, btree (id)
stephen=# select count(*) from datax_test ;
count
--------
0
(1 row)
建立配置檔案
可以通過指令檢視配置模闆: python datax.py -r {YOUR_READER} -w {YOUR_WRITER}
如下,是從MySQL中讀出資料寫入到PostgreSQL資料庫中
可以看到,當指令執行完成之後,會給出兩個URL了,分别是mysqlreader和postgresqlwriter的json配置介紹,可以仔細閱讀兩個檔案來檢視
[root@stephen bin]# python datax.py -r mysqlreader -w postgresqlwriter
DataX (DATAX-OPENSOURCE-3.0), From Alibaba !
Copyright (C) 2010-2017, Alibaba Group. All Rights Reserved.
Please refer to the mysqlreader document:
https://github.com/alibaba/DataX/blob/master/mysqlreader/doc/mysqlreader.md
Please refer to the postgresqlwriter document:
https://github.com/alibaba/DataX/blob/master/postgresqlwriter/doc/postgresqlwriter.md
Please save the following configuration as a json file and use
python {DATAX_HOME}/bin/datax.py {JSON_FILE_NAME}.json
to run the job.
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"column": [],
"connection": [
{
"jdbcUrl": [],
"table": []
}
],
"password": "",
"username": "",
"where": ""
}
},
"writer": {
"name": "postgresqlwriter",
"parameter": {
"column": [],
"connection": [
{
"jdbcUrl": "",
"table": []
}
],
"password": "",
"postSql": [],
"preSql": [],
"username": ""
}
}
}
],
"setting": {
"speed": {
"channel": ""
}
}
}
}
根據自己的兩邊資料庫資訊配置json檔案
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"column": ["id" , "name" , "birthday" , "memo"], #需要同步的字段,可以寫為*來比對所有字段
"connection": [
{
"jdbcUrl": ["jdbc:mysql://172.16.21.167:3306/test"], # mysql資料源的通路位址,與所在的資料庫
"table": ["datax_test"] # 目的表的表名稱。支援寫入一個或者多個表。當配置為多張表時,必須確定所有表結構保持一緻。
}
],
"password": "mysql", #密碼
"username": "root", #使用者
"where": ""
}
},
"writer": {
"name": "postgresqlwriter",
"parameter": {
"column": ["id" , "name" , "birthday" , "memo"], #PG端的字段
"connection": [
{
"jdbcUrl": "jdbc:postgresql://172.16.21.167:5432/stephen", #PG的資料源位址與資料名
"table": ["datax_test"] #在PG中的表名
}
],
"password": "postgres", # 密碼
"postSql": [],
"preSql": [],
"username": "postgres" # 使用者
}
}
}
],
"setting": {
"speed": {
"channel": "5" #并發通道,根據自己的資料庫性能而定,一般資料庫不建議超過32個
}
}
}
}
執行同步操作
利用剛剛準備好的json檔案,執行資料同步操作
[root@stephen datax]# python bin/datax.py job/mysql2pg.json
DataX (DATAX-OPENSOURCE-3.0), From Alibaba !
Copyright (C) 2010-2017, Alibaba Group. All Rights Reserved.
2019-08-21 15:52:26.746 [main] INFO VMInfo - VMInfo# operatingSystem class => sun.management.OperatingSystemImpl
2019-08-21 15:52:26.754 [main] INFO Engine - the machine info =>
........顯示省略..........
[total cpu info] =>
averageCpu | maxDeltaCpu | minDeltaCpu
-1.00% | -1.00% | -1.00%
[total gc info] =>
NAME | totalGCCount | maxDeltaGCCount | minDeltaGCCount | totalGCTime | maxDeltaGCTime | minDeltaGCTime
Copy | 1 | 1 | 1 | 0.049s | 0.049s | 0.049s
MarkSweepCompact | 0 | 0 | 0 | 0.000s | 0.000s | 0.000s
2019-08-21 15:52:37.605 [job-0] INFO JobContainer - PerfTrace not enable!
2019-08-21 15:52:37.605 [job-0] INFO StandAloneJobContainerCommunicator - Total 100000 records, 2488939 bytes | Speed 243.06KB/s, 10000 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 5.170s | All Task WaitReaderTime 0.848s | Percentage 100.00%
2019-08-21 15:52:37.606 [job-0] INFO JobContainer -
任務啟動時刻 : 2019-08-21 15:52:26
任務結束時刻 : 2019-08-21 15:52:37
任務總計耗時 : 10s
任務平均流量 : 243.06KB/s
記錄寫入速度 : 10000rec/s
讀出記錄總數 : 100000
讀寫失敗總數 : 0
同步成功!去Postgresql中檢視資料是否已經同步完成
stephen=# select count(*) from datax_test ;
count
--------
100000
(1 row)
stephen=#
stephen=# select * from datax_test limit 10 ;
id | name | birthday | memo
----+------------+---------------------+--------------
0 | g=14}9v7x | 2006-11-25 00:00:00 | ujGPtH/I\r
1 | *O | 2015-12-14 00:00:00 | Vg\r
2 | kD}ExP6d!0 | 2001-09-07 00:00:00 | ?\r
3 | ll3--zr | 2008-12-10 00:00:00 | |+\r
4 | Mj!j5~_~ | 2010-11-04 00:00:00 | ypE@\r
5 | mJW | 2004-08-25 00:00:00 | *Ish&NS>4k\r
6 | 65xl | 2003-09-25 00:00:00 | |HAtL2\r
7 | %6V6c7*4 | 2009-06-16 00:00:00 | dS|Ul6H\r
8 | 8:0O | 2006-01-25 00:00:00 | rOA10>zL|\r
9 | CHjFqa_ | 2018-09-26 00:00:00 | 4TY-xX\r
總結
官方上說datax能夠實作以下資料源之間的讀寫,基本上涵蓋了日常所見所聞的 有關資料庫的産品。
我隻能說,點個贊,好東西。遷移資料找它就沒錯了