datax扩展vertica插件

1.idea里面新建module

2.新建verticareader模块

3.复制mysqlreader下的pom.xml到本项目的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>
    <parent>
        <groupId>com.alibaba.datax</groupId>
        <artifactId>datax-all</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>verticareader</artifactId>
    <name>verticareader</name>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>com.alibaba.datax</groupId>
            <artifactId>datax-common</artifactId>
            <version>${datax-project-version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-log4j12</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.datax</groupId>
            <artifactId>plugin-rdbms-util</artifactId>
            <version>${datax-project-version}</version>
        </dependency>
        <dependency>
            <groupId>com.vertica</groupId>
            <artifactId>vertica-jdbc</artifactId>
            <version>9.3.1-0</version>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <!-- compiler plugin -->
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${jdk-version}</source>
                    <target>${jdk-version}</target>
                    <encoding>${project-sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <!-- assembly plugin -->
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptors>
                        <descriptor>src/main/assembly/package.xml</descriptor>
                    </descriptors>
                    <finalName>datax</finalName>
                </configuration>
                <executions>
                    <execution>
                        <id>dwzip</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

4.新建assembly目录

5.目录下新建package.xml,将此文件粘贴进去

<assembly
        xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
    <id></id>
    <formats>
        <format>dir</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>src/main/resources</directory>
            <includes>
                <include>plugin.json</include>
                <include>plugin_job_template.json</include>
            </includes>
            <outputDirectory>plugin/reader/verticareader</outputDirectory>
        </fileSet>
        <fileSet>
            <directory>target/</directory>
            <includes>
                <include>verticareader-0.0.1-SNAPSHOT.jar</include>
            </includes>
            <outputDirectory>plugin/reader/verticareader</outputDirectory>
        </fileSet>
    </fileSets>

    <dependencySets>
        <dependencySet>
            <useProjectArtifact>false</useProjectArtifact>
            <outputDirectory>plugin/reader/verticareader/libs</outputDirectory>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
</assembly>

新建plugin.json

{
  "name": "verticareader",
  "class": "com.xxxx.VerticaReader",
  "description": "vertica reader",
  "developer": "cx"
}

新建plugin_job_template.json

{
    "name": "verticareader",
    "parameter": {
        "username": "",
        "password": "",
        "column": [],
        "connection": [
            {
            "jdbcUrl": [],
            "table": []
            }
        ],
        "where": ""
    }
}

 6.src目录新建java文件,包名可以随便取

import com.alibaba.datax.common.element.StringColumn;
import com.alibaba.datax.common.exception.DataXException;
import com.alibaba.datax.common.plugin.RecordSender;
import com.alibaba.datax.common.spi.Reader;
import com.alibaba.datax.common.util.Configuration;
import com.alibaba.datax.common.element.Record;
import com.alibaba.datax.plugin.rdbms.reader.CommonRdbmsReader;
import com.alibaba.datax.plugin.rdbms.reader.Constant;
import com.alibaba.datax.plugin.rdbms.reader.Key;
import com.alibaba.datax.plugin.rdbms.util.DBUtilErrorCode;
import com.alibaba.datax.plugin.rdbms.util.DataBaseType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class VerticaReader extends Reader {

    private static final DataBaseType DATABASE_TYPE = DataBaseType.Vertica;

    public static class Job extends Reader.Job {

        private static final Logger LOG = LoggerFactory
                .getLogger(Job.class);
        private Configuration originalConfig = null;
        private CommonRdbmsReader.Job commonRdbmsReaderJob;

        @Override
        public void init() {
            this.originalConfig = super.getPluginJobConf();
            Integer userConfigedFetchSize = this.originalConfig.getInt(Constant.FETCH_SIZE);
            if (userConfigedFetchSize != null) {
                LOG.warn("对 mysqlreader 不需要配置 fetchSize, mysqlreader 将会忽略这项配置. 如果您不想再看到此警告,请去除fetchSize 配置.");
            }
            this.originalConfig.set(Constant.FETCH_SIZE, Integer.MIN_VALUE);

            this.commonRdbmsReaderJob = new CommonRdbmsReader.Job(DATABASE_TYPE);
//            this.commonRdbmsReaderJob.init(this.originalConfig);
        }

        @Override
        public void prepare() {
            LOG.info("vertica prepare....");
            init();
//            this.commonRdbmsReaderJob.preCheck(this.originalConfig,DATABASE_TYPE);
        }

        @Override
        public List<Configuration> split(int adviceNumber) {
            LOG.info("vertica split...."+adviceNumber);
            List<Configuration> configurations = new ArrayList<>();
            Integer partitions = 1;
            for (int i = 0; i < partitions; i++) {
                configurations.add(this.originalConfig.clone());
            }
            return configurations;
        }

        @Override
        public void post() {
            LOG.info("vertica post....");
            this.commonRdbmsReaderJob.post(this.originalConfig);
        }

        @Override
        public void destroy() {
            LOG.info("vertica destroy....");
            this.commonRdbmsReaderJob.destroy(this.originalConfig);
        }

    }

    public static class Task extends Reader.Task {
        private static final Logger LOG = LoggerFactory
                .getLogger(Task.class);
        private Configuration readerSliceConfig;
        private CommonRdbmsReader.Task commonRdbmsReaderTask;

        static final String JDBC_DRIVER="com.vertica.jdbc.Driver";

        static  String  DB_URL="jdbc:vertica://xxxxxx:5433/test1";

        static  String USER = "xxxx";

        static  String PASSWORD = "xxxxx";

        static String sql = "";

        Connection conn = null;
        Statement stmt = null;

        public void doCreateParams(Configuration readerSliceConfig) {
            this.USER = readerSliceConfig.getString(Key.USERNAME);
            this.PASSWORD = readerSliceConfig.getString(Key.PASSWORD);

            List<Object> conns = readerSliceConfig.getList(Constant.CONN_MARK, Object.class);

            List<Configuration> splittedConfigs = new ArrayList<Configuration>();
            Configuration connConf = Configuration.from(conns.get(0).toString());
            this.DB_URL = connConf.getList(Key.JDBC_URL).get(0).toString();
            this.sql = connConf.getList(Key.QUERY_SQL).get(0).toString();
//            for (int i = 0, len = conns.size(); i < len; i++) {
//                Configuration sliceConfig = originalSliceConfig.clone();
//
//                Configuration connConf = Configuration.from(conns.get(i).toString());
//                String jdbcUrl = connConf.getString(Key.JDBC_URL);
//            }


            LOG.info("this is ob1_0 jdbc url. user=" + this.USER + " :url=" + this.DB_URL);

        }

        @Override
        public void init() {
            this.readerSliceConfig = super.getPluginJobConf();
            this.commonRdbmsReaderTask = new CommonRdbmsReader.Task(DATABASE_TYPE,super.getTaskGroupId(), super.getTaskId());
            this.doCreateParams(this.readerSliceConfig);

            try{
                //注册 JDBC 驱动
                Class.forName(JDBC_DRIVER);
                //打开链接
                System.out.println("Connect DB..."+this.USER+","+this.PASSWORD+","+this.DB_URL);
                conn= DriverManager.getConnection(DB_URL,USER,PASSWORD);

                //执行查询
                System.out.println("实例化Statement对象...");
                stmt = conn.createStatement();

            }
            catch(Exception e){
                e.printStackTrace();
            }

        }

        @Override
        public void prepare() {
            LOG.info("vertica Task prepare....");
        }

        @Override
        public void startRead(RecordSender recordSender) {
//            int fetchSize = this.readerSliceConfig.getInt(Constant.FETCH_SIZE);
//
//            this.commonRdbmsReaderTask.startRead(this.readerSliceConfig, recordSender,
//                    super.getTaskPluginCollector(), fetchSize);
            try {
                String table = readerSliceConfig.getString(Key.TABLE);
                String columns = readerSliceConfig.getString(Key.COLUMN);
                LOG.info(table+","+columns+"------------------");

                ResultSet rs = stmt.executeQuery(sql);
                //展开结果集数据库
                System.out.println("aoeId" + "\t" + "aoeAes" + "\t" + "aoeSm4");
                while (rs.next()) {
                    System.out.print(rs.getInt(1) + "\t");
                    System.out.print(rs.getString(2) + "\t");
                    System.out.print(rs.getString(3) + "\t");
                    System.out.println();
                    Record record = recordSender.createRecord();
                    record.addColumn(new StringColumn(rs.getString(1)));
                    record.addColumn(new StringColumn(rs.getString(2)));
                    record.addColumn(new StringColumn(rs.getString(3)));
                    recordSender.sendToWriter(record);
                }
                rs.close();

            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

        @Override
        public void post() {
            LOG.info("vertica Task post....");
            this.commonRdbmsReaderTask.post(this.readerSliceConfig);
        }

        @Override
        public void destroy() {
            try {
                stmt.close();
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            LOG.info("vertica Task destroy....");
            this.commonRdbmsReaderTask.destroy(this.readerSliceConfig);
        }
    }

}

7.执行命令,生成插件

mvn -U clean package assembly:assembly -Dmaven.test.skip=true

8.将本地datax\plugin\reader目录上传到datax服务器目录datax/plugin/reader

9.编写.json配置文件

{
    "job": {
        "content": [
            {
                "reader": {
                    "parameter": {
                        "password": "xxxxxx",
                        "connection": [
                            {
                                "jdbcUrl": [
                                    "jdbc:vertica://xxxxx:5433/test1"
                                ],
                                "querySql": [
                                    "SELECT id,name as ds,age as server_id FROM TEST_01"
                                ]
                            }
                        ],
                        "writeMode": "update",
                        "username": "xxxxx"
                    },
                    "name": "verticareader"
                },
                "writer": {
                    "parameter": {
                        "password": "xxxxx",
                        "column": [
                            "id",
                            "ds",
                            "server_id"
                        ],
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:mysql://xxxxxx:3306/xxxxx?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true",
                                "table": [
                                    "xxxxx"
                                ]
                            }
                        ],
                        "writeMode": "update",
                        "username": "xxxx"
                    },
                    "name": "mysqlwriter",
                    "writeMode": "update"
                }
            }
        ],
        "setting": {
            "speed": {
                "byte": 1048576,
                "channel": 1
            }
        }
    }
}

10.执行命令python bin/datax.py job/vertica_2_mysql.json

vertica表结构

 mysql表结构

搞定:)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
### 回答1: DataX是阿里巴巴开源的一款大数据同步工具,用于实现不同数据源之间的数据同步。MySQL8是一个流行的关系型数据库,提供了更好的性能和功能。DataX的MySQL8件是为了支持从MySQL8数据库中读取数据和写入数据而开发的。 DataX的MySQL8件可以通过配置文件来连接和操作MySQL8数据库。通过指定MySQL8的连接信息,包括主机名、端口、数据库名、用户名和密码,DataX可以与MySQL8建立连接。此外,还可以配置读取的表、字段信息,以及筛选条件等。 对于读取数据,MySQL8件支持多种读取方式,包括全量读取和增量读取。全量读取是指每次读取整个表中的所有数据,而增量读取是指只读取最近一段时间内发生变化或新增的数据。通过设置不同的读取方式和参数,可以满足各种数据同步的需求。 对于写入数据,MySQL8件可以将读取的数据按照指定的规则写入到MySQL8数据库中。可以配置写入的表、字段信息,以及写入模式(覆盖、追加等)。同时,还可以进行数据转换和过滤,以确保写入的数据符合目标表的结构和要求。 总的来说,DataX的MySQL8件为用户提供了灵活和高效的数据同步方案。无论是全量同步还是增量同步,都可以通过配置件来满足不同的需求。同时,件还支持数据的转换和过滤,使得数据同步的过程更加可控和可靠。 ### 回答2: DataX是一个开源的数据同步工具,支持各种数据源之间的数据同步。MySQL是一种流行的关系型数据库系统,数据在其中以表的形式存储和组织。而DataX MySQL 件是DataX提供的一种用于将数据从其他数据源同步到MySQL数据库的件。 DataX MySQL件通过读取其他数据源的数据,并将其转换为MySQL可以接受的格式,然后入到MySQL数据库中。件支持从多种数据源(如Oracle、SQL Server、HDFS等)读取数据,并将其同步到MySQL数据库中的指定表中。 DataX MySQL件提供了丰富的配置选项,可以根据需要对数据同步过程进行详细的配置。可以指定要同步的表名、字段映射关系、数据过滤条件等。同时,件还支持并行同步,可以提高数据同步的速度和效率。 通过使用DataX MySQL件,我们可以轻松实现数据从其他数据源到MySQL数据库的迁移和同步。无论是单向同步还是增量同步,都可以通过简单的配置来实现。另外,DataX提供了丰富的件生态系统,可以支持更多不同类型的数据源,使得数据同步更加灵活和适应不同场景的需求。 总之,DataX MySQL件为我们提供了一个方便、高效的数据同步解决方案,可以帮助我们快速实现数据迁移和同步,并满足不同场景下的需求。 ### 回答3: datax是阿里巴巴开源的大数据同步工具,可以实现不同数据源之间的数据迁移和同步。datax支持多种数据源,包括MySQL、Oracle、SQL Server等。 datax的mysql件是datax中连接和操作MySQL数据库的组件。MySQL是一种常用的关系型数据库管理系统,提供了高效、可靠、稳定的数据存储和管理能力。 通过datax的mysql件,可以方便地将MySQL数据库中的数据同步到其他数据库中,或者将其他数据库中的数据同步到MySQL数据库中。datax mysql件支持多种数据同步方式,包括全量同步和增量同步。 使用datax的mysql件进行数据同步时,需要配置源数据库和目标数据库的连接信息,包括主机名、端口号、用户名、密码等。通过datax的mysql件,可以灵活配置数据同步的规则,可以选择同步表的范围,指定同步的字段,还可以进行数据过滤和转换等操作。 datax的mysql件具有高效、可靠的特点,可以在大数据量的情况下保证数据的准确性和完整性。此外,datax还提供了丰富的件和扩展,可以满足不同场景的数据同步需求。 总之,datax的mysql件是一个功能强大、使用方便的工具,可以帮助用户实现MySQL数据库之间的数据同步和迁移。无论是处理小型项目还是大规模的大数据项目,datax的mysql件都可以提供高效、可靠的数据同步解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小灰灰__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值