datax二次开发,非常详细[源码下载-项目搭建-打包发布]

本文详细介绍了如何在DataX框架中自定义开发MongoDB Reader插件,以解决读取文档和数组类型数据的问题。通过修改源码,将未识别的Document和List类型转换为JSON字符串,确保数据能被正确处理。

前序

参考文档:
datax 官网中的DataX插件开发宝典

一、环境准备

  • jdk1.8 及以上
  • idea 工具
  • git 工具

一、项目搭建

1、用idea下载源码
打开idea 选择 File->New -> Project from Version Control…
在这里插入图片描述
github地址:https://github.com/alibaba/DataX.git
在URL:填写gihub地址并Clone
在这里插入图片描述
2.等待加载相应文件…
3.Engine.java 启动文件
修改main方法,增加两行代码
//设置系统参数,参数值:datax编译后的目录
System.setProperty(“datax.home”, “D:\work\DataX\target\datax\datax”);
//设置启动参数:job的json文件的路径,和其他参数
String[] datxArgs = {"-job", “D:\work\DataX\core\src\main\job\mongo-file.json”, “-mode”, “standalone”, “-jobid”, “-1”};

   public static void main(String[] args) throws Exception {
   
   
       System.setProperty("datax.home", "D:\\work\\DataX\\target\\datax\\datax");  //datax编译后的目录
       String[] datxArgs = {
   
   "-job", "D:\\work\\DataX\\core\\src\\main\\job\\mongo-file.json", "-mode", "standalone", "-jobid", "-1"};  //自己的json文件路径
       int exitCode = 0;
       try {
   
   
           Engine.entry(datxArgs);
       } catch (Throwable e) {
   
   
           exitCode = 1;
           LOG.error("\n\n经DataX智能分析,该任务最可能的错误原因是:\n" + ExceptionTracker.trace(e));

           if (e instanceof DataXException) {
   
   
               DataXException tempException = (DataXException) e;
               ErrorCode errorCode = tempException.getErrorCode();
               if (errorCode instanceof FrameworkErrorCode) {
   
   
                   FrameworkErrorCode tempErrorCode = (FrameworkErrorCode) errorCode;
                   exitCode = tempErrorCode.toExitValue();
               }
           }

           System.exit(exitCode);
       }
       System.exit(exitCode);
   }

4.检查DataX 父目录下面pom.xml,注释掉无用的插件模块

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <groupId>com.alibaba.datax</groupId>
   <artifactId>datax-all</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <dependencies>
       <dependency>
           <groupId>org.hamcrest</groupId>
           <artifactId>hamcrest-core</artifactId>
           <version>1.3</version>
       </dependency>
   </dependencies>

   <name>datax-all</name>
   <packaging>pom</packaging>

   <properties>
       <jdk-version>1.8</jdk-version>
       <datax-project-version>0.0.1-SNAPSHOT</datax-project-version>
       <commons-lang3-version>3.3.2</commons-lang3-version>
       <commons-configuration-version>1.10</commons-configuration-version>
       <commons-cli-version>1.2</commons-cli-version>
       <fastjson-version>1.1.46.sec01</fastjson-version>
       <guava-version>16.0.1</guava-version>
       <diamond.version>3.7.2.1-SNAPSHOT</diamond.version>

       <!--slf4j 1.7.10 和 logback-classic 1.0.13 是好基友 -->
       <slf4j-api-version>1.7.10</slf4j-api-version>
       <logback-classic-version>1.0.13</logback-classic-version>
       <commons-io-version>2.4</commons-io-version>
       <junit-version>4.11</junit-version>
       <tddl.version>5.1.22-1</tddl.version>
       <swift-version>1.0.0</swift-version>

       <project-sourceEncoding>UTF-8</project-sourceEncoding>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
       <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
   </properties>

   <modules>
       <module>common</module>
       <module>core</module>
       <module>transformer</module>

       <!-- reader -->
<!--        <module>mysqlreader</module>-->
<!--        <module>drdsreader</module>-->
<!--        <module>sqlserverreader</module>-->
<!--        <module>postgresqlreader</module>-->
<!--        <module>oraclereader</module>-->
<!--        <module>odpsreader</module>-->
<!--        <module>otsreader</module>-->
<!--        <module>otsstreamreader</module>-->
<!--        <module>txtfilereader</module>-->
<!--        <module>hdfsreader</module>-->
<!--        <module>streamreader</module>-->
<!--        <module>ossreader</module>-->
<!--        <module>ftpreader</module>-->
       <module>mongodbreader</module>
<!--        <module>rdbmsreader</module>-->
<!--        <module>hbase11xreader</module>-->
<!--        <module>hbase094xreader</module>-->
<!--        <module>tsdbreader</module>-->
<!--        <module>opentsdbreader</module>-->
<!--        <module>cassandrareader</module>-->
<!--        <module>gdbreader</module>-->

       <!-- writer -->
<!--        <module>mysqlwriter</module>-->
<!--        <module>drdswriter</module>-->
<!--        <module>odpswriter</module>-->
       <module>txtfilewriter</module>
<!--        <module>ftpwriter</module>-->
       <module>hdfswriter</module>
       <module>streamwriter</module>
<!--        <module>otswriter</module>-->
<!--        <module>oraclewriter</module>-->
<!--        <module>sqlserverwriter</module>-->
<!--        <module>postgresqlwriter</module>-->
<!--        <module>osswriter</module>-->
<!--        <module>mongodbwriter</module>-->
<!--        <module>adswriter</module>-->
<!--        <module>ocswriter</module>-->
<!--        <module>rdbmswriter</module>-->
<!--        <module>hbase11xwriter</module>-->
<!--        <module>hbase094xwriter</module>-->
<!--        <module>hbase11xsqlwriter</module>-->
<!--        <module>hbase11xsqlreader</module>-->
<!--        <module>elasticsearchwriter</module>-->
<!--        <module>tsdbwriter</module>-->
<!--        <module>adbpgwriter</module>-->
<!--        <module>gdbwriter</module>-->
<!--        <module>cassandrawriter</module>-->
<!--        <module>clickhousewriter</module>-->
       <!-- common support module -->
<!--        <module>plugin-rdbms-util</module>-->
<!--        <module>plugin-unstructured-storage-util</module>-->
<!--        <module>hbase20xsqlreader</module>-->
<!--        <module>hbase20xsqlwriter</module>-->
   </modules>

   <dependencyManagement>
       <dependencies>
           <dependency>
               <groupId>org.apache.commons</groupId>
               <artifactId>commons-lang3</artifactId>
               <version>${commons-lang3-version}</version>
           </dependency>
           <dependency>
               <groupId>com.alibaba</groupId>
               <artifactId>fastjson</artifactId>
               <version>${fastjson-version}</version>
           </dependency>
           <!--<dependency>
               <groupId>com.google.guava</groupId>
               <artifactId>guava</artifactId>
               <version>${guava-version}</version>
           </dependency>-->
           <dependency>
               <groupId>commons-io</groupId>
               <artifactId>commons-io</artifactId>
               <version>${commons-io-version}</version>
           </dependency>
           <dependency>
               <groupId>org.slf4j</groupId>
               <artifactId>slf4j-api</artifactId>
               <version>${slf4j-api-version}</version>
           </dependency>
           <dependency>
               <groupId>ch.qos.logback</groupId>
               <artifactId>logback-classic</artifactId>
               
### 关于 DataX-Web 的二次开发 DataX 是阿里巴巴开源的一款异构数据源离线同步工具,而 DataX-Web 则是对 DataX 的封装,提供了一个可视化的操作界面来简化任务调度和管理。对于 DataX-Web 的二次开发需求,通常涉及以下几个方面: #### 1. **自定义插件开发** 如果需要扩展 DataX 支持的数据源或功能,可以通过开发新的 Reader 和 Writer 插件实现。以下是基本流程: - 阅读官方文档中的插件开发指南[^1]。 - 创建一个新的 Maven 工程,继承 `com.alibaba.datax` 提供的基础类。 - 实现核心接口,例如 `Reader` 或 `Writer` 接口。 ```java public class CustomReader extends BaseReader { @Override public List<Configuration> split(int mandatoryNumber) { // 数据分片逻辑 return super.split(mandatoryNumber); } @Override protected void init() throws Exception { // 初始化逻辑 } @Override public void startRead(RecordSender recordSender) throws Exception { // 数据读取逻辑 } } ``` - 将新开发的插件打包并放置到 DataX 的插件目录下。 #### 2. **修改现有功能** 对于现有的功能模块(如任务调度、日志记录等),可以基于 DataX-Web 的源码进行调整。具体步骤如下: - 下载 DataX-Web 的源码仓库[^1]。 - 定位目标功能对应的代码文件,例如任务调度器位于 `scheduler` 模块中。 - 修改业务逻辑后重新编译项目,并替换原有的 jar 文件。 #### 3. **解决特定问题** 在某些场景下,可能会遇到类似 numeric 类型作为主键无法分片的问题[^2]。这种情况下,可以选择以下解决方案之一: - 调整数据库设计,将 numeric 类型转换为 integer 或 string 类型。 - 编写自定义 SQL 查询语句,在不依赖内置分片机制的情况下完成数据迁移。 - 扩展 DataX 的分片逻辑,使其能够支持更多类型的字段。 #### 4. **集成第三方组件** 若希望增强 DataX-Web 功能,比如引入监控告警系统,则需对接外部服务 API 并更新前端页面显示相关内容。此过程可能涉及到前后端联调工作。 ```bash # 示例命令:克隆 DataX-Web 项目至本地 git clone https://github.com/alibaba/datax-web.git cd datax-web/ mvn clean install -DskipTests=true ``` 以上便是针对 DataX-Web 进行二次开发的一些常见方向和技术要点说明。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值