datax及datax-web部署及填坑记录

8,529 阅读1分钟

DataX与DataXWeb本地部署

1、DataX部署

这里由于后续需要修改源码,所以选择下载DataX源码,自己编译:DataX源码

(1)、下载DataX源码:

 $ git clone git@github.com:alibaba/DataX.git

(2)、通过maven打包:

 $ cd  {DataX_source_code_home}
 $ mvn -U clean package assembly:assembly -Dmaven.test.skip=true

打包成功,日志显示如下:

 [INFO] BUILD SUCCESS
 [INFO] -----------------------------------------------------------------
 [INFO] Total time: 08:12 min
 [INFO] Finished at: 2015-12-13T16:26:48+08:00
 [INFO] Final Memory: 133M/960M
 [INFO] -----------------------------------------------------------------

打包成功后的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      script  

在这里有可能会遇到编译错误,有几个解决方案:

  • 若是用不到的插件出错,直接在项目根目录下的pom.xml文件中注释掉相应插件模组即可,例:

    若drdsreader编译错误,直接将配置<module>drdsreader</module>注释掉即可

  • 若遇到对引用不明确的编译错误,那就到相应的地方把出错的类加上具体的包名。

配置示例:从stream读取数据并打印到控制台

  • 第一步、创建作业的配置文件(json格式)

    可以通过命令查看配置模板: python datax.py -r {YOUR_READER} -w {YOUR_WRITER}

     $ cd  {YOUR_DATAX_HOME}/bin
     $  python datax.py -r streamreader -w streamwriter
     DataX (UNKNOWN_DATAX_VERSION), From Alibaba !
     Copyright (C) 2010-2015, Alibaba Group. All Rights Reserved.
     Please refer to the streamreader document:
         https://github.com/alibaba/DataX/blob/master/streamreader/doc/streamreader.md 
     ​
     Please refer to the streamwriter document:
          https://github.com/alibaba/DataX/blob/master/streamwriter/doc/streamwriter.md 
      
     Please save the following configuration as a json file and  use
          python {DATAX_HOME}/bin/datax.py {JSON_FILE_NAME}.json 
     to run the job.
     ​
     {
         "job": {
             "content": [
                 {
                     "reader": {
                         "name": "streamreader", 
                         "parameter": {
                             "column": [], 
                             "sliceRecordCount": ""
                         }
                     }, 
                     "writer": {
                         "name": "streamwriter", 
                         "parameter": {
                             "encoding": "", 
                             "print": true
                         }
                     }
                 }
             ], 
             "setting": {
                 "speed": {
                     "channel": ""
                 }
             }
         }
     }
    

    根据模板配置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

     $ cd {YOUR_DATAX_DIR_BIN}
     $ python datax.py ./stream2stream.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
    

以上任务成功就代表datax部署成功了(Python3的问题后面会说到)

2、DataX-Web的部署:

创建数据库

执行bin/db下面的datax_web.sql文件(注意老版本更新语句有指定库名)

修改项目配置

1.修改datax_admin下resources/application.yml文件

 #数据源
   datasource:
     username: root
     password: root
     url: jdbc:mysql://localhost:3306/datax_web?serverTimezone=Asia/Shanghai&useLegacyDatetimeCode=false&useSSL=false&nullNamePatternMatchesAll=true&useUnicode=true&characterEncoding=UTF-8
     driver-class-name: com.mysql.jdbc.Driver

修改数据源配置,目前仅支持mysql

 # 配置mybatis-plus打印sql日志
 logging:
   level:
     com.wugui.datax.admin.mapper: error
   path: ./data/applogs/admin

修改日志路径path

   # datax-web email
   mail:
     host: smtp.qq.com
     port: 25
     username: xxx@qq.com
     password: xxx
     properties:
       mail:
         smtp:
           auth: true
           starttls:
             enable: true
             required: true
         socketFactory:
           class: javax.net.ssl.SSLSocketFactory

修改邮件发送配置(不需要可以不修改)

修改datax_executor下resources/application.yml文件

 # log config
 logging:
   config: classpath:logback.xml
   path: ./data/applogs/executor/jobhandler

修改日志路径path

 datax:
   job:
     admin:
       ### datax-web admin address
       addresses: http://127.0.0.1:8080
     executor:
       appname: datax-executor
       ip:
       port: 9999
       ### job log path
       logpath: ./data/applogs/executor/jobhandler
       ### job log retention days
       logretentiondays: 30
   executor:
     jsonpath: /Users/mac/data/applogs
 
   pypath: /Users/mac/tools/datax/bin/datax.py

修改datax.job配置

  • admin.addresses datax_admin部署地址,如调度中心集群部署存在多个地址则用逗号分隔,执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";
  • executor.appname 执行器AppName,每个执行器机器集群的唯一标示,执行器心跳注册分组依据;
  • executor.ip 默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
  • executor.port 执行器Server端口号,默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
  • executor.logpath 执行器运行日志文件存储磁盘路径,需要对该路径拥有读写权限;
  • executor.logretentiondays 执行器日志文件保存天数,过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
  • executor.jsonpath datax json临时文件保存路径
  • pypath DataX启动脚本地址,例如:xxx/datax/bin/datax.py 如果系统配置DataX环境变量(DATAX_HOME),logpath、jsonpath、pypath可不配,log文件和临时json存放在环境变量路径下。

注:如果用的是Python3的话需要将{YOUR_DATAX_HOME}/bin目录下的三个py文件替换成{YOUR_DATAX_WEB_HOME}/doc/datax-web/datax-python3目录下的三个文件

3、启动项目

本地idea开发环境

  • 1.运行datax_admin下 DataXAdminApplication
  • 2.运行datax_executor下 DataXExecutorApplication

img

admin启动成功后日志会输出三个地址,两个接口文档地址,一个前端页面地址

4、启动成功

启动成功后打开页面(默认管理员用户名:admin 密码:123456) http://localhost:8080/index.html#/dashboard img

DataX任务配置

在DataX源代码目录下每一个插件都有自己的使用文档及任务模板,使用文档在插件目录下的doc文件夹内;任务模板是插件目录下的src/main/resources中的plugin_job_template.json文件。

在每个插件的使用文档中都会有相应的简单配置示例,及相关配置项的说明。

新建一个配置json文件,然后按照DataX部署这一步骤最后一步的使用方法使用即可。

DataX-Web任务配置

1.执行器配置(使用开源项目xxl-job)

img

  • 1、"调度中心OnLine:"右侧显示在线的"调度中心"列表, 任务执行结束后, 将会以failover的模式进行回调调度中心通知执行结果, 避免回调的单点风险;
  • 2、"执行器列表" 中显示在线的执行器列表, 可通过"OnLine 机器"查看对应执行器的集群机器;

执行器属性说明

img

 1、AppName: (与datax-executor中application.yml的datax.job.executor.appname保持一致)
    每个执行器集群的唯一标示AppName, 执行器会周期性以AppName为对象进行自动注册。可通过该配置自动发现注册成功的执行器, 供任务调度时使用;
 2、名称: 执行器的名称, 因为AppName限制字母数字等组成,可读性不强, 名称为了提高执行器的可读性;
 3、排序: 执行器的排序, 系统中需要执行器的地方,如任务新增, 将会按照该排序读取可用的执行器列表;
 4、注册方式:调度中心获取执行器地址的方式;
     自动注册:执行器自动进行执行器注册,调度中心通过底层注册表可以动态发现执行器机器地址;
     手动录入:人工手动录入执行器的地址信息,多地址逗号分隔,供调度中心使用;
 5、机器地址:"注册方式"为"手动录入"时有效,支持人工维护执行器的地址信息;

2.创建数据源

img

第四步使用

3.创建任务模版

img

第四步使用

4. 构建JSON脚本

  • 1.步骤一,步骤二,选择第二步中创建的数据源,JSON构建目前支持的数据源有hive,mysql,oracle,postgresql,sqlserver,hbase,mongodb,clickhouse 其它数据源的JSON构建正在开发中,暂时需要手动编写。

img

  • 2.字段映射

img

  • 3.点击构建,生成json,此时可以选择复制json然后创建任务,选择datax任务,将json粘贴到文本框。也可以点击选择模版,直接生成任务。

img

5.批量创建任务

img img

6.任务创建介绍(关联模版创建任务不再介绍,具体参考4. 构建JSON脚本)

支持DataX任务,Shell任务,Python任务,PowerShell任务

img

img

  • 阻塞处理策略:调度过于密集执行器来不及处理时的处理策略;

    • 单机串行:调度请求进入单机执行器后,调度请求进入FIFO队列并以串行方式运行;
    • 丢弃后续调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败;
    • 覆盖之前调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务;
  • 增量增新建议将阻塞策略设置为丢弃后续调度或者单机串行

    • 设置单机串行时应该注意合理设置重试次数(失败重试的次数*每次执行时间<任务的调度周期),重试的次数如果设置的过多会导致数据重复,例如任务30秒执行一次,每次执行时间需要20秒,设置重试三次,如果任务失败了,第一个重试的时间段为1577755680-1577756680,重试任务没结束,新任务又开启,那新任务的时间段会是1577755680-1577758680
  • 增量参数设置

  • 分区参数设置

7. 任务列表

img

8. 可以点击查看日志,实时获取日志信息,终止正在执行的datax进程

img img

9.任务资源监控

img

10. admin可以创建用户,编辑用户信息

img

以上配置方法基本可以应付所有的情况。

DataX修改

在rdbmsreader插件目录下的src/main/resources/plugin.json文件中的drivers属性数组中加入"org.apache.hive.jdbc.HiveDriver"

如下:

"drivers":["dm.jdbc.driver.DmDriver", "com.sybase.jdbc3.jdbc.SybDriver", "com.edb.Driver","org.apache.hive.jdbc.HiveDriver"]

再在该插件目录下的src/main/libs文件夹下加入hive的jdbc驱动,这里我用的是hive-jdbc-uber-2.6.5.0-292.jar包,下载地址:hive-jdbc-uber-2.6.5.0-292.jar

接下来我们就能编写一个简单的从hive读取数据打印到控制台的任务配置文件了:

 {
   "job": {
     "setting": {
       "speed": {
         "channel": 1
       }
     },
     "content": [
       {
         "reader": {
           "name": "rdbmsreader",
           "parameter": {
             "username": "xxxx",
             "password": "xxxx",
             "column": [
               "*"
             ],
             "connection": [
               {
                 "table": [
                   "xxxx"
                 ],
                 "jdbcUrl": [
                   "jdbc:hive2://{ip}:{port}/{database}"
                 ]
               }
             ],
             "fetchSize": 1024,
             "where": "1 = 1"
           }
         },
         "writer": {
           "name": "streamwriter",
           "parameter": {
             "print": true
           }
         }
       }
     ]
   }
 }

DataX-web修改

  • 将{YOUR_DATAX_WEB_HOME}\datax-admin\src\main\java\com\wugui\datax\admin\tool\datax\DataxJsonHelper.java文件第123行注释掉,再新添一行:

    buildReader = buildReader()

    (修改解释:当遇到hive数据源时,不再使用hiveReader构建(hiveReader会使用hdfsReader插件的构建方式)而是使用rdbms数据库任务构建方式)

  • 在同文件第203行default:前加入以下代码段:

     case HIVE:
         return "`"+column.split(":")[1]+"`";
    

    (修改解释:column解析出来的初始结果为“索引:字段名:字段类型”,当遇到hive数据源,取字段名并给每个字段名头尾加上“`”)

  • 在同文件223行,修改代码如下:

     speedMap.putAll(ImmutableMap.of("channel", 3));
    

    (修改解释:该修改是修改的job中的settings配置项,可以根据各自需要来修改)

  • 在{YOUR_DATAX_WEB_HOME}\datax-admin\src\main\java\com\wugui\datax\admin\tool\datax\reader\HiveReader.java文件的getName方法中将返回的字符串修改为“rdbmsreader”

    (修改解释:该修改是让最后生成的datax任务中的插件名变成rdbmsreader,若不想更改,也可以每次生成后手动更改。)

至此,修改完成,按照批量创建任务来创建hive任务即可。

时间增量配置

此处全部摘自datax-web官方文档:

一、根据日期进行增量数据抽取

1.页面任务配置

打开菜单任务管理页面,选择添加任务

按下图中5个步骤进行配置

img

  • 1.任务类型选DataX任务
  • 2.辅助参数选择时间自增
  • 3.增量开始时间选择,即sql中查询时间的开始时间,用户使用此选项方便第一次的全量同步。第一次同步完成后,该时间被更新为上一次的任务触发时间,任务失败不更新。
  • 4.增量时间字段,-DlastTime='%s' -DcurrentTime='%s' 先来解析下这段字符串
 1.-D是DataX参数的标识符,必配
 2.-D后面的lastTime和currentTime是DataX json中where条件的时间字段标识符,必须和json中的变量名称保持一致
 3.='%s'是项目用来去替换时间的占位符,比配并且格式要完全一致
 4.注意-DlastTime='%s'和-DcurrentTime='%s'中间有一个空格,空格必须保留并且是一个空格
  • 5.时间格式,可以选择自己数据库中时间的格式,也可以通过json中配置sql时间转换函数来处理

注意,注意,注意: 配置一定要仔细看文档(后面我们也会对这块配置进行优化,避免大家犯错)

2.JSON配置

datax.json

 {
   "job": {
     "setting": {
       "speed": {
         "channel": 16
       }
     },
     "content": [
       {
         "reader": {
           "name": "mysqlreader",
           "parameter": {
             "splitPk": "id",
             "username": "root",
             "password": "root",
             "column": [
               "*"
 ​
             ],
             "connection": [
               {
                 
                 "jdbcUrl": [
                   "jdbc:mysql://localhost:3306/test?characterEncoding=utf8"
                 ],
                 "querySql": [
         "select * from test_list where operationDate >= FROM_UNIXTIME(${lastTime}) and operationDate < FROM_UNIXTIME(${currentTime})"
                                 ]
               }
             ]
           }
         },
         "writer": {
           "name": "mysqlwriter",
           "parameter": {
            
             "username": "root",
             "password": "123456",
             "column": [
               "*"
             ],
             "batchSize": "4096",
             "connection": [
               {
                 "jdbcUrl": "jdbc:mysql://localhost:3307/test?characterEncoding=utf8",
                 "table": [
                   "test_list"
                 ]
               }
             ]
           }
         }
       }
     ]
   }
 }

querySql解析

 select * from test_list where operationDate >= ${lastTime} and operationDate < ${currentTime}
  • 1.此处的关键点在,​{currentTime},${}是DataX动态参数的固定格式,lastTime,currentTime就是我们页面配置中 -DlastTime='%s' -DcurrentTime='%s'中的lastTime,currentTime,注意字段一定要一致。
  • 2.如果任务配置页面,时间类型选择为时间戳但是数据库时间格式不是时间戳,例如是:2019-11-26 11:40:57 此时可以用FROM_UNIXTIME(${lastTime})进行转换。
 select * from test_list where operationDate >= FROM_UNIXTIME(${lastTime}) and operationDate < FROM_UNIXTIME(${currentTime})

二、根据自增Id进行增量数据抽取

1.页面任务配置

打开菜单任务管理页面,选择添加任务

按下图中4个步骤进行配置

img

  • 1.任务类型选DataX任务
  • 2.辅助参数选择主键自增
  • 3.增量主键开始ID选择,即sql中查询ID的开始ID,用户使用此选项方便第一次的全量同步。第一次同步完成后,该ID被更新为上一次的任务触发时最大的ID,任务失败不更新。
  • 4.增量时间字段,-DstartId='%s' -DendId='%s' 先来解析下这段字符串
 1.-D是DataX参数的标识符,必配
 2.-D后面的startId和endId是DataX json中where条件的id字段标识符,必须和json中的变量名称保持一致,endId是任务在每次执行时获取当前表maxId,也是下一次任务的startId
 3.='%s'是项目用来去替换时间的占位符,比配并且格式要完全一致
 4.注意-DstartId='%s'和-DendId='%s' 中间有一个空格,空格必须保留并且是一个空格
 5.reader数据源,选择任务同步的读数据源
 6.配置reader数据源中需要同步数据的表名及该表的主键

注意,注意,注意: 一定要仔细看文档(后续会对这块配置进行优化,避免大家犯错)

2.JSON配置

datax.json

 {
    "job": {
      "setting": {
        "speed": {
          "channel": 3,
          "byte": 1048576
        },
        "errorLimit": {
          "record": 0,
          "percentage": 0.02
        }
      },
      "content": [
        {
          "reader": {
            "name": "mysqlreader",
            "parameter": {
              "username": "yRjwDFuoPKlqya9h9H2Amg==",
              "password": "yRjwDFuoPKlqya9h9H2Amg==",
              "splitPk": "",
              "connection": [
                {
                  "querySql": [
                    "select * from job_log where id>= ${startId} and id< ${endId}"
                  ],
                  "jdbcUrl": [
                    "jdbc:mysql://localhost:3306/datax_web"
                  ]
                }
              ]
            }
          },
          "writer": {
            "name": "mysqlwriter",
            "parameter": {
              "username": "mCFD+p1IMsa0rHicbQohcA==",
              "password": "PhYxJmA/nuBJD1OxKTRzZH8sxuRddOv83hdqDOVR+i0=",
              "column": [
                "`id`",
                "`job_group`",
                "`job_id`",
                "`job_desc`",
                "`executor_address`",
                "`executor_handler`",
                "`executor_param`",
                "`executor_sharding_param`",
                "`executor_fail_retry_count`",
                "`trigger_time`",
                "`trigger_code`",
                "`trigger_msg`",
                "`handle_time`",
                "`handle_code`",
                "`handle_msg`",
                "`alarm_status`",
                "`process_id`",
                "`max_id`"
              ],
              "connection": [
                {
                  "table": [
                    "job_log"
                  ],
                  "jdbcUrl": "jdbc:mysql://47.98.125.243:3306/datax_web"
                }
              ]
            }
          }
        }
      ]
    }
  }
querySql解析
 select * from job_log where id>= ${startId} and id< ${endId}
  • 1.此处的关键点在,​{endId},${}是DataX动态参数的固定格式,startId,endId就是我们页面配置中 -DstartId='%s' -DendId='%s'中的startId,endId,注意字段一定要一致。

三、JVM启动参数配置

此选择为非必选,可以配置DataX启动时JVM的参数,具体配置不做详解。

  • JVM启动参数拼接结果为: -j "-Xms2G -Xmx2G"

querySql不是自动生成的,一定要根据具体数据库自己编写,然后写入配置中!!!!!

针对hive数据库做时间增量的一个提醒

一定要注意hive数据库的时区,如果时区不对,需要调整时区,可以参考以下querySql:

 "querySql": ["select * from test_timestamp where `date` >= unix_timestamp(from_utc_timestamp(${lastTime}, 'PRC'))  and `date` < unix_timestamp(from_utc_timestamp(${currentTime}, 'PRC'))"]