Datax+DataX-Web分布式搭建
DataX简介
DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。
DataX本身作为数据同步框架,将不同数据源的同步抽象为从源头数据源读取数据的Reader插件,以及向目标端写入数据的Writer插件,理论上DataX框架可以支持任意数据源类型的数据同步工作。同时DataX插件体系作为一套生态系统, 每接入一套新数据源该新加入的数据源即可实现和现有的数据源互通。
为了解决异构数据源同步问题,DataX将复杂的网状的同步链路变成了星型数据链路,DataX作为中间传输载体负责连接各种数据源。当需要接入一个新的数据源的时候,只需要将此数据源对接到DataX,便能跟已有的数据源做到无缝数据同步。
DataX 框架设计
DataX本身作为离线数据同步框架,采用Framework + plugin架构构建。将数据源读取和写入抽象成为Reader/Writer插件,纳入到整个同步框架中。
- Reader:Reader为数据采集模块,负责采集数据源的数据,将数据发送给Framework。
- Writer: Writer为数据写入模块,负责不断向Framework取数据,并将数据写入到目的端。
- Framework:Framework用于连接reader和writer,作为两者的数据传输通道,并处理缓冲,流控,并发,数据转换等核心技术问题。
DataX插件体系
经过几年积累,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各个模块相互关系。
核心模块介绍:
- DataX完成单个数据同步的作业,我们称之为Job,DataX接受到一个Job之后,将启动一个进程来完成整个作业同步过程。DataX Job模块是单个作业的中枢管理节点,承担了数据清理、子任务切分(将单一作业计算转化为多个子Task)、TaskGroup管理等功能。
- DataXJob启动后,会根据不同的源端切分策略,将Job切分成多个小的Task(子任务),以便于并发执行。Task便是DataX作业的最小单元,每一个Task都会负责一部分数据的同步工作。
- 切分多个Task之后,DataX Job会调用Scheduler模块,根据配置的并发数据量,将拆分成的Task重新组合,组装成TaskGroup(任务组)。每一个TaskGroup负责以一定的并发运行完毕分配好的所有Task,默认单个任务组的并发数量为5。
- 每一个Task都由TaskGroup负责启动,Task启动后,会固定启动Reader—>Channel—>Writer的线程来完成任务同步工作。
- DataX作业运行起来之后, Job监控并等待多个TaskGroup模块任务完成,等待所有TaskGroup任务完成后Job成功退出。否则,异常退出,进程退出值非0
DataX调度流程:
举例来说,用户提交了一个DataX作业,并且配置了20个并发,目的是将一个100张分表的mysql数据同步到odps里面。 DataX的调度决策思路是:
- DataXJob根据分库分表切分成了100个Task。
- 根据20个并发,DataX计算共需要分配4个TaskGroup。
- 4个TaskGroup平分切分好的100个Task,每一个TaskGroup负责以5个并发共计运行25个Task。
DataX调度流程:
举例来说,用户提交了一个DataX作业,并且配置了20个并发,目的是将一个100张分表的mysql数据同步到odps里面。 DataX的调度决策思路是:
- DataXJob根据分库分表切分成了100个Task。
- 根据20个并发,DataX计算共需要分配4个TaskGroup。
- 4个TaskGroup平分切分好的100个Task,每一个TaskGroup负责以5个并发共计运行25个Task。
DataX单机部署
系统需求
- Linux
- JDK(1.8以上,推荐1.8)
- Python(2或3都可以)
- Apache Maven 3.x (Compile 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编译成功。
DataX-Web简介
系统需求
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
安装mysql5.7
# 这里使用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;
安装datax
# 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安装成功
安装datax-web
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 ubuntu@10.10.10.$i **********************************\n"
ssh ubuntu@10.10.10.$i 'source /etc/profile; \
java -version; \
mvn -v; \
python --version;';
done;
配置maven
for i in {133..135} 151 157;
do
echo -e "\n********************************** Config ubuntu@10.10.10.$i **********************************\n"
scp ~/Downloads/apache-maven-3.6.3.tar.gz ubuntu@10.10.10.$i:~/;
ssh ubuntu@10.10.10.$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 ubuntu@10.10.10.$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<<EOF
# MVN_HOME
export MVN_HOME=/opt/software/apache-maven-3.6.3
export PATH=\$PATH:\$MVN_HOME/bin
EOF
cat /tmp/10.10.10.$i/Z99-wntime-env-config.sh;
scp /tmp/10.10.10.$i/Z99-wntime-env-config.sh ubuntu@10.10.10.$i:~/Z99-wntime-env-config.sh;
ssh ubuntu@10.10.10.$i 'sudo mv ~/Z99-wntime-env-config.sh /etc/profile.d/Z99-wntime-env-config.sh; \
sudo chmod +x /etc/profile.d/Z99-wntime-env-config.sh; \
source /etc/profile; \
echo $MVN_HOME;'
done;
安装python
for i in {133..135} 151 157;
do
echo -e "\n********************************** Config ubuntu@10.10.10.$i **********************************\n"
ssh ubuntu@10.10.10.$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 ubuntu@10.10.10.$i **********************************\n"
scp ~/Downloads/datax_v202210.tar.gz ubuntu@10.10.10.$i:~/;
ssh ubuntu@10.10.10.$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 ubuntu@10.10.10.$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<<EOF
# MVN_HOME
export DATAX_HOME=/opt/software/datax_v202210
export PATH=\$PATH:\$DATAX_HOME/bin
EOF
cat /tmp/10.10.10.$i/Z99-wntime-env-config.sh;
scp /tmp/10.10.10.$i/Z99-wntime-env-config.sh ubuntu@10.10.10.$i:~/Z99-wntime-env-config.sh;
ssh ubuntu@10.10.10.$i 'sudo mv ~/Z99-wntime-env-config.sh /etc/profile.d/Z99-wntime-env-config.sh; \
sudo chmod +x /etc/profile.d/Z99-wntime-env-config.sh; \
source /etc/profile; \
echo $DATAX_HOME;'
done;
验证datax 安装
for i in {133..135} 151 157;
do
echo -e "\n********************************** Config ubuntu@10.10.10.$i **********************************\n"
ssh ubuntu@10.10.10.$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 ubuntu@10.10.10.$i **********************************\n"
scp ~/Downloads/datax-web-2.1.2.tar.gz ubuntu@10.10.10.$i:~/;
ssh ubuntu@10.10.10.$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 ubuntu@10.10.10.$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 ubuntu@10.10.10.$i **********************************\n"
ssh ubuntu@10.10.10.$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 ubuntu@10.10.10.$i **********************************\n"
ssh ubuntu@10.10.10.$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 ubuntu@10.10.10.$i **********************************\n"
ssh ubuntu@10.10.10.$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 ubuntu@10.10.10.$i **********************************\n"
ssh ubuntu@10.10.10.$i "source /etc/profile; \
cd /opt/software/datax-web-2.1.2/; \
./bin/stop.sh -m datax-executor;";
done;