簡介
隨着業務量的上升,以前的架構已經不滿足業務的發展,數據作為業務中最重要的一環,需要有更好的架構作為支撐。目前我司有sql server轉mysql的需求,所以結合當前業務,我挑選了阿里雲開源的一個很好用的同步工具DataX
DataX介紹
DataX 是一個異構數據源離線同步工具,致力於實現包括關系型數據庫(MySQL、Oracle等)、HDFS、Hive、MaxCompute(原ODPS)、HBase、FTP等各種異構數據源之間穩定高效的數據同步功能。
框架設計
DataX本身作為離線數據同步框架,采用Framework + plugin架構構建。將數據源讀取和寫入抽象成為Reader/Writer插件,納入到整個同步框架中。
- Reader:Reader為數據采集模塊,負責采集數據源的數據,將數據發送給Framework。
- Writer: Writer為數據寫入模塊,負責不斷向Framework取數據,並將數據寫入到目的端。
- Framework:Framework用於連接reader和writer,作為兩者的數據傳輸通道,並處理緩沖,流控,並發,數據轉換等核心技術問題。
實戰
下載安裝部署
$ wget http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz
$ tar zxvf datax.tar.gz
$ sudo chmod -R 755 {YOUR_DATAX_HOME}
也可以自己下載源碼安裝,不過需要安裝maven
$ git clone git@github.com:alibaba/DataX.git
$ cd {DataX_source_code_home}
$ mvn -U clean package assembly:assembly -Dmaven.test.skip=true
打包成功后的DataX包位於 {DataX_source_code_home}/target/datax/datax/ ,結構如下:
$ cd {DataX_source_code_home}
$ ls ./target/datax/datax/
bin conf job lib log log_perf plugin
配置
你需要編寫一個基本信息配置文件,文件包括原庫到寫入庫的表字段對應關系。基本信息包括
{
"job": {
"content": [
{
"reader": { //讀入庫配置,比如說是sql server
"name": "", //數據源名稱,別瞎寫
"parameter": {} //數據庫配置信息
},
"writer": { //寫入庫配置,比如說是mysql
"name": "", //數據源名稱,別瞎寫
"parameter": {} //數據庫配置信息
}
}
],
"setting": { //基本設置
"speed": { //流量控制
"channel": 1, //同步時候的並發數
"byte": 104857600 //同步時候的字節大小,影響速度
},
"errorLimit": { //臟數據控制
"record": 10, //臟數據最大記錄數閾值
"percentage": 0.05 //臟數據占比閾值
}
}
}
}
下面給一個配置demo,大家根據自己的需要修改demo,然后使用
{
"job": {
"setting": {
"speed": {
"byte": 1073741824
}
},
"content": [
{
"reader": {
"name": "sqlserverreader",
"parameter": {
"username": "root", //自己根據需要修改數據庫用戶名
"password": "admin", //密碼
"where": "",
"connection": [
{
"querySql": [
"SELECT Id,MyReasonId,MyProductType,MyReason FROM dbo.MyReason WITH ( NOLOCK )"
],//全量sql,根據自己需要寫增量sql也可以
"jdbcUrl": [
"jdbc:sqlserver://192.168.1.1:1433;DatabaseName=XXXX"
]//自己根據需要修改數據庫連接
}
]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert", //寫入模式,這里寫插入
"username": "root",//自己根據需要修改數據庫用戶名
"password": "admin",//密碼
"column": [
"id", //注意與上面的列一一對應
"my_reason_id",
"my_product_type",
"my_reason"
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://192.168.1.2:3306/XXX?useUnicode=true&characterEncoding=utf-8",
"table": [
"my_reason"
]
}
]
}
}
}
]
}
}
編輯好之后,放到新建work目錄里面,然后存為mssql_to_mysql.json,下面就可以運行了
運行
$ cd {YOUR_DATAX_HOME}/bin
$ python datax.py ../work/mssql_to_mysql.json
同步結束,顯示日志如下:
...
2015-12-17 11:20:25.263 [job-0] INFO JobContainer -
任務啟動時刻 : 2015-12-17 11:20:15
任務結束時刻 : 2015-12-17 11:20:25
任務總計耗時 : 10s
任務平均流量 : 205B/s
記錄寫入速度 : 5rec/s
讀出記錄總數 : 50
讀寫失敗總數 : 0
這樣就說明成功啦
進階
job配置
將你需要同步的增量數據放入到安裝目錄job下面,存為myjob.json,名稱隨意
linux下通過crontab命令實現
#查看crond服務是否啟動,出現以下日志表示已啟動
$/sbin/service crond status
crond (pid 30742) is running...
第一步:創建作業的配置文件(json格式) 參考上節內容。這里假設已配置好MySQL到ODPS的配置文件mysql2odps.json
第二步:列出列出crontab文件,命令: crontab -l
(1)若出現以下日志,表示當前用戶沒有定時任務,用戶需要新建crontab文件,並提交crontab文件,參考第三步。$crontab -l
no crontab for xxx
(2)若出現以下日志,表示當前用戶已經有正在運行的定時任務,用戶只需用命令crontab -e 來編輯crontab文件,參考第四步。 shell $ crontab -l 0,10,20,35,44,50 * * * * python /home/admin/datax3/bin/datax.py /home/admin/mysql2odps.json >>/home/hanfa.shf/log.date +\%Y\%m\%d\%H\%M\%S2>&1
第三步:若當前用戶沒有定時任務(之前從未創建過crontab任務)
(1)創建一個新的crontab文件,如取名crondatax
示例1:每天13點5分進行同步作業,並把運行日志輸出到目錄/home/hanfa.shf/下log.運行時間 文件中,如定時運行是在2016-3-26 13:10:13運行的,產生的日志文件名為:log.20160326131023
$ vim crondatax
#輸入以下內容
5 13 * * * python /home/admin/datax3/bin/datax.py /home/admin/mysql2odps.json >>/home/hanfa.shf/log.`date +\%Y\%m\%d\%H\%M\%S` 2>&1
#/home/admin/datax3/bin/datax.py 表示你安裝的DataX datax.py所在目錄(請替換為您真實的絕對路徑目錄);
#/home/admin/mysql2odps.json 表示作業的配置文件目錄(請替換為您真實的絕對路徑目錄);
#/home/hanfa.shf/log.`date +\%Y\%m\%d\%H\%M\%S` 表示日志輸出位置,並以log.當前時間 命名(請替換為您真實的絕對路徑目錄)(2)提交你剛剛創建的crontab文件
shell $ crontab crondatax #crondatax 你創建的crontab文件名(3)重啟crontab服務
shell $ sudo /etc/init.d/crond restart Stopping crond: [ OK ] Starting crond: [ OK ](4)在13點5分過后,在日志目錄會看到對應的日文件
shell $ ls -al /home/hanfa.shf/ -rw-r--r-- 1 hanfa.shf users 12062 Mar 26 13:05 log.20160326130501第四步:若當前用戶已有定時任務(想繼續增加定時任務)
(1)編輯已有crontab文件
示例2:每10分鍾運行一次同步任務,並把運行日志輸出到目錄/home/hanfa.shf/下log.運行時間 文件中,如定時運行是在2016-3-26 13:10:13運行的,產生的日志文件名為:log.20160326131023$ crontab -e
#會進入已有crontab文件編輯界面,繼續增加定時任務即可,本示例增加以下內容,並保存
0,10,20,30,40,50 * * * * python /home/admin/datax3/bin/datax.py /home/admin/mysql2odps.json >>/home/hanfa.shf/log.`date +\%Y\%m\%d\%H\%M\%S` 2>&1(2)重啟crontab服務
$ sudo /etc/init.d/crond restart
(3)用crontab -l 命令檢查是否添加成功
$ crontab -l
5 13 * * * python /home/admin/datax3/bin/datax.py /home/admin/mysql2odps.json >>/home/hanfa.shf/log.`date +\%Y\%m\%d\%H\%M\%S` 2>&1
0,10,20,30,40,50 * * * * python /home/admin/datax3/bin/datax.py /home/admin/mysql2odps.json >>/h
進階內容引自官方教程 ^_^
