• datax和datax-web打包成docker运行


    概述

    dataxdatax-web从一台机器迁移到另一台时,要重新搭建一套运行环境,比较麻烦;打包成docker镜像后迁移就方便多了;

    因为我的mysql版本是8,需要在dataxreadwrite中手动添加8jdbc驱动
    所以我先各自下载好了dataxdatax-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自身脚本问题,配置问题等;有一些linuxdocker的认知,解决问题会更有方向一些.
    镜像制作完,之后要新部署/迁移就方便多了;

    实际部署中发现即使手动加入了新的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包;

    因为我的mysql8dataxreadwriter下的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
    

    打包镜像

    将准备okdatax文件夹和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=root
          - DB_PASSWORD=Cttx10086
          - 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-webenv.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.version8.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

  • 相关阅读:
    jq里的ajax超详细参数讲解
    UE5.1_常用快捷键
    Typora 自定义样式(mac 风代码块、引用块、加粗、高亮、图片默认居左、行内代码)
    液晶显示计算器(主程序)
    微信小程序积分活动有哪些玩法
    【Java八股40天-Day5】 IO 和 NIO
    如何解决国标GB28181视频平台EasyGBS国标云服务平台设备在线,通道却显示离线的情况
    使用目标之间的先验关系提升目标检测器性能
    Talk | 清华大学陈晓宇&苏黎世联邦理工黄嘉伟 :基于实际应用的强化学习
    Redis JDBC
  • 原文地址:https://blog.csdn.net/weixin_43944305/article/details/141088293