概述
datax和datax-web从一台机器迁徙到另一台时,要重新搭建一套运行环境,比力麻烦;打包成docker镜像后迁徙就方便多了;
由于我的mysql版本是8,需要在datax的read和write中手动添加8的jdbc驱动
所以我先各自下载好了datax和datax-web,在宿主机上试了一波ok后;
然后手动打包成了docker镜像,方便后续迁徙
我的环境
ubuntu22.04
jdk:1.8+
python:3.10.12
maven:3.8.8
docker:26.00
docker-compose:2.24.7
datax-web:2.1.2
打包过程中还是遇到了一些细节题目,比如环境题目,datax自身脚本题目,设置题目等;有一些linux和docker的认知,解决题目会更有方向一些.
镜像制作完,之后要新部署/迁徙就方便多了;
实际部署中发现即使手动参加了新的jdbc驱动,但是在实验日记中还是发现有com.mysql.jdbc.Driver旧驱动的warning信息;
要彻底解决需要down datax的代码,将jdbc驱动版本手动调解为8.0+的版本,然后手动打包重新上传包,我重新打包出来后有2G+…
重新打包方案写在下面了
准备工作
datax
https://github.com/alibaba/DataX/tree/datax_v202303
datax-web
https://github.com/WeiYe-Jing/datax-web/tags
down一波datax-web的源码,用idea打开,然后在bin下新增一个health.sh,一会在启动docker容器时让后台常驻(我想的是直接调用原脚本启动,不改原来的启动脚本,所以自己塞了一个进去);
然后mvn clean install一下,拿到datax-web-2.1.2.tar.gz包;
由于我的mysql是8,datax的read和writer下的lib中没有对应的jdbc驱动,所以需要手动下载塞进去;
另外datax运行需要python环境,所以在声明 FROM python:3.10.12 运行环境后, java环境是手动add进去jdk后,手动设置的env环境,这里准备好jdk8的包即可,下面的docker file中有对应设置;
我的运行环境是python3,所以需要从datax的官网上把对应的python脚本down下来,覆盖到datax-web的指定目录下,这个在我的datax和datax-web直接宿主机部署中有写.
上面步骤都ok后,就可以开始打包镜像了;
我另一篇文章有写datax和datax-web直接在宿主机部署,其实宿主机ok了,剩下的无非就是打包进docker镜像
https://blog.csdn.net/weixin_43944305/article/details/133617114
health.sh
- while true
- do
- jps | grep "Datax*"
- sleep 30
- done
复制代码 打包镜像
将准备ok的datax文件夹和datax-web文件夹打包并压缩成tar.gz,然后写一个dockerfile,手动build下就可以用了.
dockerfile
- # 基础镜像
- FROM python:3.10.12
- # author
- MAINTAINER felix
- # 创建目录
- RUN mkdir -p /app
- run mkdir -p /app/datax-python3
- # work dir
- workdir /app
- # 复制文件到路径
- add ./pro/datax.tar.gz .
- add ./pro/datax-web-2.1.2.tar.gz .
- # jdk环境
- add ./pro/jdk-8u181-linux-x64.tar.gz .
- # 设置JAVA_HOME环境变量
- ENV JAVA_HOME="/app/jdk1.8.0_181"
-
- # 将JAVA_HOME添加到PATH环境变量
- ENV JRE_HOME $JAVA_HOME/jre
- ENV CLASSPATH $JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
- ENV PATH $JAVA_HOME/bin:$PATH
- # datax支持python3文件替换
- copy ./pro/datax-python3 ./datax-python3/
- #支持python3替换datax/bin下3个文件
- run mv -f ./datax-python3/datax.py ./datax/bin/
- run mv -f ./datax-python3/dxprof.py ./datax/bin/
- run mv -f ./datax-python3/perftrace.py ./datax/bin/
- #datax-web-admin 添加mysql8的jdbc驱动
- copy ./pro/mysql-connector-j-8.0.33.jar ./datax-web-2.1.2/modules/datax-admin/lib/
- # datax自身配置问题,手动将单个channel的大小改为2Mb
- RUN sed -i 's/"byte": -1/"byte": 2097152/g' ./datax/conf/core.json
- # 启动服务
- CMD sh -c "./datax-web-2.1.2/bin/install.sh --force" && sh -c "./datax-web-2.1.2/bin/start-all.sh" && sh -c "./datax-web-2.1.2/bin/health.sh"
复制代码 docker-compose脚本
我这边把datax-executor的env.properties捞出来映射了下,方便设置
- version: '3'
- services:
- datax-web:
- build:
- context: ./
- dockerfile: ./Dockerfile
- image: datax-web
- container_name: datax-web
- restart: always
- privileged: true
- ports:
- - 9527:9527
- environment:
- - TZ=Asia/Shanghai
- #我的mysql和datax在一个docker网段,所以直接用了容器name链接,正常可以写ip
- - DB_HOST=mysql_8_0
- - DB_PORT=3306
- - DB_USERNAME=xxxx
- - DB_PASSWORD=xxxx
- - DB_DATABASE=datax_web
- volumes:
- - ./config/datax-executor/env.properties:/app/datax-web-2.1.2/modules/datax-executor/bin/env.properties
- - ./config/datax-admin/env.properties:/app/datax-web-2.1.2/modules/datax-admin/bin/env.properties
- networks:
- - dev_net
- networks:
- dev_net:
- external: true
复制代码 datax-executor的env.properties
其实也没改啥,就把datax的python脚本路径写了下
- # 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=
- ## PYTHON脚本执行位置
- #PYTHON_PATH=/home/hadoop/install/datax/bin/datax.py
- PYTHON_PATH=/app/datax/bin/datax.py
- ## dataxweb 服务端口
- SERVER_PORT=9504
复制代码 datax-admin的env.properties
将datax-web的env.properties映射进去,方便背面调解
- # environment variables
- #JAVA_HOME="/home/felix/app/jdk/jdk1.8.0_181"
- 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
复制代码 重启脚本
每次都要手敲命令,整个脚本轻松一点
- #!/bin/sh
- echo '==============start stop==========='
- docker stop datax-web
- echo '==============end stop========='
- #docker ps -a | grep datax-web | awk '{print $1}' | xargs docker stop
- #docker rm datax-web
- echo '=============start docker rm======='
- docker ps -a | grep datax-web | awk '{print $1}' | xargs docker rm
- echo '=============end docker rm========='
- echo '=============start docker rmi======'
- docker rmi datax-web
- echo '=============end docker rmi========'
- docker build -t datax-web:latest .
- echo 'ready go'
- docker-compose up -d
复制代码 启动后实验ok
解决datax的com.mysql.jdbc.Driver老驱动题目
1-修改pom中的mysql.driver.version为8.0.29
2-修改com.alibaba.datax.plugin.rdbms.util.DataBaseType中的驱动name,而且将“convertToNull”修改为“CONVERT_TO_NULL”
3-修改com.alibaba.datax.plugin.writer.adswriter.load.AdsHelper中的驱动name
4-重新打包后上传新的datax压缩包
- mvn -U clean package assembly:assembly -Dmaven.test.skip=true
复制代码 参考博文
https://www.cnblogs.com/ll409546297/p/17541727.html
https://www.cnblogs.com/zifan/p/12550747.html
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |