DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。
DataX本身作为数据同步框架,将不同数据源的同步抽象为从源头数据源读取数据的Reader插件,以及向目标端写入数据的Writer插件,理论上DataX框架可以支持任意数据源类型的数据同步工作。同时DataX插件体系作为一套生态系统, 每接入一套新数据源该新加入的数据源即可实现和现有的数据源互通。
为了解决异构数据源同步问题,DataX将复杂的网状的同步链路变成了星型数据链路,DataX作为中间传输载体负责连接各种数据源。当需要接入一个新的数据源的时候,只需要将此数据源对接到DataX,便能跟已有的数据源做到无缝数据同步。
DataX本身作为离线数据同步框架,采用Framework + plugin架构构建。将数据源读取和写入抽象成为Reader/Writer插件,纳入到整个同步框架中。
经过几年积累,DataX目前已经有了比较全面的插件体系,主流的RDBMS数据库、NOSQL、大数据计算系统都已经接入。DataX目前支持数据如下:
类型 | 数据源 | Reader(读) | Writer(写) | 文档 |
---|---|---|---|---|
RDBMS 关系型数据库 | MySQL | √ | √ | 读 、写 |
Oracle | √ | √ | 读 、写 | |
OceanBase | √ | √ | 读 、写 | |
SQLServer | √ | √ | 读 、写 | |
PostgreSQL | √ | √ | 读 、写 | |
DRDS | √ | √ | 读 、写 | |
达梦 | √ | √ | 读 、写 | |
通用RDBMS(支持所有关系型数据库) | √ | √ | 读 、写 | |
阿里云数仓数据存储 | ODPS | √ | √ | 读 、写 |
ADS | √ | 写 | ||
OSS | √ | √ | 读 、写 | |
OCS | √ | √ | 读 、写 | |
NoSQL数据存储 | OTS | √ | √ | 读 、写 |
Hbase0.94 | √ | √ | 读 、写 | |
Hbase1.1 | √ | √ | 读 、写 | |
MongoDB | √ | √ | 读 、写 | |
Hive | √ | √ | 读 、写 | |
无结构化数据存储 | TxtFile | √ | √ | 读 、写 |
FTP | √ | √ | 读 、写 | |
HDFS | √ | √ | 读 、写 | |
Elasticsearch | √ | 写 |
DataX Framework提供了简单的接口与插件交互,提供简单的插件接入机制,只需要任意加上一种插件,就能无缝对接其他数据源。详情请看:DataX数据源指南
DataX 开源版本支持单机多线程模式完成同步作业运行,本小节按一个DataX作业生命周期的时序图,从整体架构设计非常简要说明DataX各个模块相互关系。
举例来说,用户提交了一个DataX作业,并且配置了20个并发,目的是将一个100张分表的mysql数据同步到odps里面。 DataX的调度决策思路是:
举例来说,用户提交了一个DataX作业,并且配置了20个并发,目的是将一个100张分表的mysql数据同步到odps里面。 DataX的调度决策思路是:
(1)、下载DataX源码:
wget https://github.com/alibaba/DataX/archive/refs/tags/datax_v202210.tar.gz
(2)、通过maven打包:
cd DataX-datax_v202210
mvn -U clean package assembly:assembly -Dmaven.test.skip=true
编译报错:
手动下载
# 搜索缺失jar包
https://mvnrepository.com/artifact/org.pentaho/pentaho-aggdesigner-algorithm/5.1.5-jhyde
# 无法下载
# Google 搜到 https://repository.mapr.com/nexus/content/groups/mapr-public/conjars/org/pentaho/pentaho-aggdesigner-algorithm/5.1.5-jhyde/
wget https://repository.mapr.com/nexus/content/groups/mapr-public/conjars/org/pentaho/pentaho-aggdesigner-algorithm/5.1.5-jhyde/pentaho-aggdesigner-algorithm-5.1.5-jhyde.jar
wget https://repository.mapr.com/nexus/content/groups/mapr-public/conjars/org/pentaho/pentaho-aggdesigner-algorithm/5.1.5-jhyde/pentaho-aggdesigner-algorithm-5.1.5-jhyde.pom
# 或参照 https://blog.csdn.net/AlierSnow/article/details/125105548
# 手动安装到本地库
mvn install:install-file -Dfile=./pentaho-aggdesigner-algorithm-5.1.5-jhyde.jar -DgroupId=org.pentaho -DartifactId=pentaho-aggdesigner-algorithm -Dversion=5.1.5-jhyde -Dpackaging=jar
# 搜索缺失jar包
https://mvnrepository.com/artifact/eigenbase/eigenbase-properties/1.1.4
# 无法下载
# Google 搜到 https://archiva.wikimedia.org/repository/mirrored/eigenbase/eigenbase-properties/1.1.4/
wget https://archiva.wikimedia.org/repository/mirrored/eigenbase/eigenbase-properties/1.1.4/eigenbase-properties-1.1.4.jar
wget https://archiva.wikimedia.org/repository/mirrored/eigenbase/eigenbase-properties/1.1.4/eigenbase-properties-1.1.4.pom
# 手动安装到本地库
mvn install:install-file -DgroupId=eigenbase -DartifactId=eigenbase-properties -Dversion=1.1.4 -Dpackaging=jar -Dfile=eigenbase-properties-1.1.4.jar
编译成功
ls ./target/datax/datax/
# 结构如下
bin conf job lib log log_perf plugin script tmp
从stream读取数据并打印到控制台
第一步、创建作业的配置文件(json格式)
可以通过命令查看配置模板: python datax.py -r {YOUR_READER} -w {YOUR_WRITER}
cd ./target/datax/datax/bin
vim stream2stream.json
根据模板配置json如下:
# stream2stream.json
{
"job": {
"content": [
{
"reader": {
"name": "streamreader",
"parameter": {
"sliceRecordCount": 10,
"column": [
{
"type": "long",
"value": "10"
},
{
"type": "string",
"value": "hello,你好,世界-DataX"
}
]
}
},
"writer": {
"name": "streamwriter",
"parameter": {
"encoding": "UTF-8",
"print": true
}
}
}
],
"setting": {
"speed": {
"channel": 5
}
}
}
}
第二步:启动DataX
python datax.py ./stream2stream.json
同步结束,显示日志如下:
datax编译成功。
1、datax:datax-web的核心资源包
2、jdk(jdk版本建议1.8.201以上)
3、Maven(编译工具)
4、python (推荐python 2.7, python 3需要修改datax相关配置)
5、tomcat (可不装)
6、mysql 5.7 或者8 (用于存放datax-web相关用户信息以及任务信息)
# 测试是否安装
java -version
mvn -v
python --version
# 这里使用docker安装
docker run --name ainns-mysql -e MYSQL_ROOT_PASSWORD=wntime*8 -d -v /tmp/mysql-dir:/var/lib/mysql -p 3306:3306 mysql:5.7.42-oracle --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
docker exec -it ainns-mysql /bin/bash
# 配置mysql
mysql -uroot -p;
use mysql;
select host, user, authentication_string, plugin from user;
GRANT ALL ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;
# data 安装路径 ~/Programs/datax/
cd ~/Programs/datax/
python ./bin/datax.py ./job/job.json
# 配置环境变量
vim ~/.bashrc
#set datax environment
export DATAX_HOME=/home/WNTime/Programs/datax
export PATH=$PATH:$DATAX_HOME/bin
如下图所示,表示datax安装成功
tar -zxf ~/Downloads/datax-web-v-2.1.2.tar.gz
cd datax-web-v-2.1.2
初始化数据库
# 找到 bin/db/datax_web.sql 文件,进行初始化
打包程序
mvn clean install
在./build/文件夹中可以找到打包好的文件
测试运行
cd ./build/
tar -zxf datax-web-2.1.2.tar.gz
cd datax-web-2.1.2/
./bin/install.sh #按照提示安装
安装后效果
修改admin配置
vim ./modules/datax-admin/conf/bootstrap.properties
#Database
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USERNAME=root
DB_PASSWORD=wntime*8
DB_DATABASE=datax_web
环境变量配置文件
vim ./modules/datax-admin/bin/env.properties
# environment variables
#JAVA_HOME=""
WEB_LOG_PATH=${BIN}/../logs
WEB_CONF_PATH=${BIN}/../conf
DATA_PATH=${BIN}/../data
SERVER_PORT=9527
#PID_FILE_PATH=${BIN}/dataxadmin.pid
# mail account
MAIL_USERNAME=""
MAIL_PASSWORD=""
#debug
#REMOTE_DEBUG_SWITCH=true
#REMOTE_DEBUG_PORT=7003
启动admin
./bin/start.sh -m datax-admin
修改executor
环境变量配置文件
vim ./modules/datax-executor/bin/env.properties
# environment variables
#JAVA_HOME=""
SERVICE_LOG_PATH=${BIN}/../logs
SERVICE_CONF_PATH=${BIN}/../conf
DATA_PATH=${BIN}/../data
## datax json文件存放位置
JSON_PATH=${BIN}/../json
## executor_port
EXECUTOR_PORT=9999
## 保持和datax-admin端口一致
DATAX_ADMIN_PORT=9527
## PYTHON脚本执行位置
#PYTHON_PATH=/home/hadoop/install/datax/bin/datax.py
PYTHON_PATH=${BIN}/../python
## dataxweb 服务端口
SERVER_PORT=9504
#PID_FILE_PATH=${BIN}/service.pid
#debug 远程调试端口
#REMOTE_DEBUG_SWITCH=true
#REMOTE_DEBUG_PORT=7004
启动executor
./bin/start.sh -m datax-executor
for i in {133..135} 151 157;
do
echo -e "\n********************************** Config [email protected].$i **********************************\n"
ssh [email protected].$i 'source /etc/profile; \
java -version; \
mvn -v; \
python --version;';
done;
配置maven
for i in {133..135} 151 157;
do
echo -e "\n********************************** Config [email protected].$i **********************************\n"
scp ~/Downloads/apache-maven-3.6.3.tar.gz [email protected].$i:~/;
ssh [email protected].$i 'sudo mkdir -p /opt/software/; \
#sudo rm -f /etc/profile.d/Z99-wntime-env-config.sh; \
sudo touch /etc/profile.d/Z99-wntime-env-config.sh; \
sudo tar -zxf ~/apache-maven-3.6.3.tar.gz -C /opt/software/;';
# config env
rm -rf /tmp/"10.10.10.$i"/;
mkdir -p /tmp/"10.10.10.$i"/;
scp [email protected].$i:/etc/profile.d/Z99-wntime-env-config.sh /tmp/"10.10.10.$i"/Z99-wntime-env-config.sh;
sudo cat>>/tmp/"10.10.10.$i"/Z99-wntime-env-config.sh<
安装python
for i in {133..135} 151 157;
do
echo -e "\n********************************** Config [email protected].$i **********************************\n"
ssh [email protected].$i 'sudo apt install python2; \
source /etc/profile; \
java -version; \
mvn -v; \
python --version;';
done;
安装datax
for i in {133..135} 151 157;
do
echo -e "\n********************************** Config [email protected].$i **********************************\n"
scp ~/Downloads/datax_v202210.tar.gz [email protected].$i:~/;
ssh [email protected].$i 'sudo mkdir -p /opt/software/; \
#sudo rm -f /etc/profile.d/Z99-wntime-env-config.sh; \
sudo touch /etc/profile.d/Z99-wntime-env-config.sh; \
sudo tar -zxf ~/datax_v202210.tar.gz -C /opt/software/; \
sudo mv /opt/software/datax /opt/software/datax_v202210';
# config env
rm -rf /tmp/"10.10.10.$i"/;
mkdir -p /tmp/"10.10.10.$i"/;
scp [email protected].$i:/etc/profile.d/Z99-wntime-env-config.sh /tmp/"10.10.10.$i"/Z99-wntime-env-config.sh;
sudo cat>>/tmp/"10.10.10.$i"/Z99-wntime-env-config.sh<
验证datax 安装
for i in {133..135} 151 157;
do
echo -e "\n********************************** Config [email protected].$i **********************************\n"
ssh [email protected].$i 'cd /opt/software/datax_v202210; \
source /etc/profile; \
python ./bin/datax.py ./job/job.json;';
done;
安装datax-web
for i in {133..135} 151 157;
do
echo -e "\n********************************** Config [email protected].$i **********************************\n"
scp ~/Downloads/datax-web-2.1.2.tar.gz [email protected].$i:~/;
ssh [email protected].$i 'sudo mkdir -p /opt/software/; \
sudo rm -rf /opt/software/datax-web-2.1.2; \
sudo tar -zxf ~/datax-web-2.1.2.tar.gz -C /opt/software/;';
ssh [email protected].$i 'cd /opt/software/datax-web-2.1.2; \
sudo ./bin/install.sh --force; \
sudo chown -R ubuntu:ubuntu /opt/software/datax-web-2.1.2;';
done;
启动admin
# vim ./modules/datax-admin/conf/bootstrap.properties
for i in {134..135} 151;
do
echo -e "\n********************************** Config [email protected].$i **********************************\n"
ssh [email protected].$i "sed -i 's/127.0.0.1/10.10.10.77/g' /opt/software/datax-web-2.1.2/modules/datax-admin/conf/bootstrap.properties; \
source /etc/profile; \
cd /opt/software/datax-web-2.1.2/; \
./bin/start.sh -m datax-admin;";
done;
停止admin
# vim ./modules/datax-admin/conf/bootstrap.properties
for i in {134..135} 151;
do
echo -e "\n********************************** Config [email protected].$i **********************************\n"
ssh [email protected].$i "source /etc/profile; \
cd /opt/software/datax-web-2.1.2/; \
./bin/stop.sh -m datax-admin;";
done;
启动executor
# vim ./modules/datax-admin/conf/bootstrap.properties
for i in {133..135} 151 157;
do
echo -e "\n********************************** Config [email protected].$i **********************************\n"
ssh [email protected].$i "sed -i 's/^DATAX_ADMIN_ADDRESSES=.*\$/DATAX_ADMIN_ADDRESSES=http:\/\/10.10.10.134:9527,http:\/\/10.10.10.135:9527,http:\/\/10.10.10.151:9527/g' /opt/software/datax-web-2.1.2/modules/datax-executor/bin/env.properties; \
source /etc/profile; \
cd /opt/software/datax-web-2.1.2/; \
./bin/start.sh -m datax-executor;";
done;
停止executor
# vim ./modules/datax-admin/conf/bootstrap.properties
for i in {133..135} 151 157;
do
echo -e "\n********************************** Config [email protected].$i **********************************\n"
ssh [email protected].$i "source /etc/profile; \
cd /opt/software/datax-web-2.1.2/; \
./bin/stop.sh -m datax-executor;";
done;