DataX安装部署-Reader插件二次开发

 

DataX

DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各种异构数据源之间高效的数据同步功能。

DataX详细介绍

请参考:DataX-Introduction

DataX是什么可参考:https://blog.csdn.net/burpee/article/details/53734393

DataX安装部署及小试
1.下载压缩包:
下载页面地址:https://github.com/alibaba/DataX 在页面中【Quick Start】--->【Download DataX下载地址】进行下载。下载后的包名:datax.tar.gz。解压后{datax}目录下有{bin conf job lib log log_perf plugin script tmp}几个目录。

2.安装
将下载后的压缩包直接解压后可用,前提是对应的java及python环境满足要求。

System Requirements:

  • Linux
  • JDK(1.6以上,推荐1.6)
  • Python(推荐Python2.6.X)一定要为python2,因为后面执行datax.py的时候,里面的python的print会执行不了,导致运行不成功,会提示你print语法要加括号,python2中加不加都行 python3中必须要加,否则报语法错,因为执行过程通过python脚本执行,所以python3环境报错无法运行。
  • Apache Maven 3.x (Compile DataX)

3.测试
配置测试样例:下面我们配置一组 从TXT文本到另一个TXT文本。  

第一步、创建作业的配置文件(json格式)
在bin目录执行 python datax.py -r {your_reader} -w {your_writer}

{your_reader} 为datax\plugin\reader 目录下的插件名字,到包名就可以,{your_writer}相同;

如图:txtfilereaderTest是我二次开发之后的包,在datax\plugin\reader目录下;

执行python datax.py -r txtfilereaderTest -w txtFileWriter;会生成下面红框json模板,只需要将其复制出来,在datax\job\目录下新建一个newJob.josn 然后内容使用该模板。

自己配置的模板如下:

  1. {
  2.     "job": {
  3.         "content": [
  4.             {
  5.                "reader": {
  6.                     "name": "Test",
  7.                     "parameter": {
  8.                         "column": [
  9.                         {
  10.                              "index": 0,
  11.                               "type": "string"
  12.                         },
  13.                         {
  14.                              "index": 1,
  15.                               "type": "string"
  16.                         }
  17.                         ],
  18.                         "encoding": "utf-8",
  19.                         "fieldDelimiter": ",",
  20.                         "skipHeader": "True",
  21.                         "path": ["E:/python_project/BigData-Base/etl/test/ADDRESS02.txt"]
  22.                     }
  23.                 },
  24.                 "writer": {
  25.                     "name": "txtfilewriter",
  26.                     "parameter": {
  27.                         "dateFormat": "yyyy-MM-dd",
  28.                         "fieldDelimiter": ",",
  29.                         "fileName": "ADDRESS.txt",
  30.                         "path": "E:/datax/job/",
  31.                         "writeMode": "append"
  32.                     }
  33.                 }
  34.             }
  35.         ],
  36.         "setting": {
  37.             "speed": {
  38.                 "channel": "1"
  39.             }
  40.         }
  41.     }
  42. }

模板具体内容怎么配置可参考:https://github.com/alibaba/DataX ,官方每个包内都有个doc文件夹,里面专门有配置参数说明,按照说明配置即可。

启动:python datax.py {your_file} 如果是Windows则要写绝对路径。

python datax.py E:\datax\job\txtjsonTest.json

windows下乱码修复:
我把这个工具迁移到一台windows主机上使用时候看到控制台友好的中文提示居然都变成了乱码了(话说有中文提示也是我选择他很重要的理由啊)。还好官方也给出了解决方案:
打开CMD.exe命令行窗口
通过 chcp命令改变代码页,UTF-8的代码页为65001
chcp 65001
执行该操作后,代码页就被变成UTF-8了。但是,在窗口中仍旧不能正确显示UTF-8字符。
修改窗口属性,改变字体,在命令行标题栏上点击右键,选择"属性"->"字体",将字体修改为True Type字体"Lucida Console",然后点击确定将属性应用到当前窗口。
运行:

DataX目前支持读写数据格式:

类型数据源Reader(读)Writer(写)文档
RDBMS 关系型数据库MySQL 、
           Oracle        √        √     、
 SQLServer 、
 PostgreSQL 、
 DRDS 、
 通用RDBMS(支持所有关系型数据库) 、
阿里云数仓数据存储ODPS 、
 ADS 
 OSS 、
 OCS 、
NoSQL数据存储OTS 、
 Hbase0.94 、
 Hbase1.1 、
 Phoenix4.x 、
 MongoDB 、
 Hive 、
无结构化数据存储TxtFile 、
 FTP 、
 HDFS 、
 Elasticsearch 

也可以参考其他博客,测试例子基本相同,实际使用根据自己需求调整配置文件即可,目前DataX已经迭代到了3.0版本,开源部分目前是单机版本,不过阿里内部已经可以集群运行了,3.0中也有所体现,未来说不定集群版本也会开源呢。


列举一下官方文档:

github:https://github.com/alibaba/DataX

下载:https://github.com/alibaba/DataX/blob/master/userGuid.md

DataX数据源参考指南:https://github.com/alibaba/DataX/wiki/DataX-all-data-channels

DataX插件开发宝典:https://github.com/alibaba/DataX/blob/master/dataxPluginDev.md


DataX插件二次开发

如果官方提供的插件没有自己需要用的怎么办,就需要自己开发需要的插件了,可参考官方DataX插件开发宝典。

我做了一个Reader插件,读取TXT文档的时候清除单引号的ETLdemo。

1. 创建一个maven工程。

模板:只需要改artifactId,name其他内容不变。

pom.xml内容,红色标记为自己文件

<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>Test</artifactId>
   <name>Test</name>
   <description>txtFilereaderTest,并可以根据用户配置的类型进行类型转换,建议开发、测试环境使用。</description>
   <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>com.alibaba.datax</groupId>
         <artifactId>plugin-unstructured-storage-util</artifactId>
         <version>${datax-project-version}</version>
      </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.google.guava</groupId>
         <artifactId>guava</artifactId>
            <version>16.0.1</version>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <!-- compiler plugin -->
         <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
               <source>1.6</source>
               <target>1.6</target>
               <encoding>${project-sourceEncoding}</encoding>
            </configuration>
         </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>

2. 创建如下文件树

package.xml 文件为最后打包文件

它会读取模板配置:plugin.json;plugin_job_template.json

需要自行修改的已标红,其他目录级别不可变。

<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/txtFilereaderTest</outputDirectory>
      </fileSet>
      <fileSet>
         <directory>target/</directory>
         <includes>
            <include>txtFilereaderTest-0.0.1-SNAPSHOT.jar</include>
         </includes>
         <outputDirectory>plugin/reader/txtFilereaderTest</outputDirectory>
      </fileSet>
   </fileSets>

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

 plugin.json文件:

class:你自己的class文件目录,我的是reader插件,所以在reader目录下的txtFilereaderTest包里的Test类。

{
    "name": "Test",
    "class": "com.alibaba.datax.plugin.reader.txtFilereaderTest.Test",
    "description": "useScene: test. mechanism: use datax framework to transport data from txt file. warn: The more you know about the data, the less problems you encounter.",
    "developer": "alibaba"
}

plugin_job_template.json文件:

该文件用于开始生成模板的文件,reader插件与writer插件各有不同,可参考官方不同包下的doc文件夹里的说明。

{
    "name": "Test",
    "parameter": {
        "path": [],
        "encoding": "",
        "column": [],
        "fieldDelimiter": ""
    }
}

剩下的如何编写逻辑就要自己实现了,可以先参考官方说明:DataX插件开发宝典 

我这里简单实现一下去除文本中单引号,部分代码如下:

重写startRead方法,并且在文件输入流中对读入的文本进行字符串替换处理,将“ ‘北京‘ ”,处理为:“北京”;

自己要实现的所有逻辑都在此编写。

@Override
    public void startRead(RecordSender recordSender) {
        LOG.debug("start read source files...");
        for (String fileName : this.sourceFiles) {
            LOG.info(String.format("reading file : [%s]", fileName));
            InputStream inputStream;
            InputStream inputStreamEtl;
            try {
                inputStream = new FileInputStream(fileName);
                try {
                    inputStreamEtl =  string_InputStream(inputStream_String(inputStream));
                    com.alibaba.datax.plugin.unstructuredstorage.reader.UnstructuredStorageReaderUtil.readFromStream(inputStreamEtl,
                            fileName, this.readerSliceConfig, recordSender,
                            this.getTaskPluginCollector());
                    recordSender.flush();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } catch (FileNotFoundException e) {
                // warn: sock 文件无法read,能影响所有文件的传输,需要用户自己保证
                String message = String
                        .format("找不到待读取的文件 : [%s]", fileName);
                LOG.error(message);
                throw DataXException.asDataXException(
                        TxtFileReaderErrorCode.OPEN_FILE_ERROR, message);
            }
        }
        LOG.debug("end read source files...");
    }

}

/**
 * inputStream to String
 * @param in
 * @return "去除字符串中引号"
 * @throws Exception
 */
public static String inputStream_String(InputStream in) throws Exception
{
    java.io.ByteArrayOutputStream swapStream = new java.io.ByteArrayOutputStream();
    int ch;
    while ((ch = in.read()) != -1) {
        swapStream.write(ch);
    }
    /**
     * ETL: 去除字符之间的单引号
     * '北京', '大兴',
     * 北京, 大兴,
     */
    return swapStream.toString().replace("'","");
}

/**
 * String to inputStream
 * @param str
 * @return
 * @throws Exception
 */
public static ByteArrayInputStream string_InputStream(String str) throws Exception{
    ByteArrayInputStream stream= new ByteArrayInputStream(str.getBytes());
    return stream;
}

3. 打包部署 

编写好的文件按照上图文件树放置,然后添加自己插件到Git clone下的源码最外层package.xml和pom.xml 文件。

package.xml

directory:为你的插件包名,不是类名

<fileSet>
    <directory>txtFilereaderTest/target/datax/</directory>
    <includes>
        <include>**/*.*</include>
    </includes>
    <outputDirectory>datax</outputDirectory>
</fileSet>

pom.xml

同上,添加自己包名,添加至reader树内,我使用idea开发,所以maven工程可直接打包。

注意:该pom文件用maven打包会将所有插件都重新打一次包,如果只想打自己的包,将其他reader和writer包都注释掉,不然需要好久

<module>txtFileReaderTest</module>

 

4. 打包成功 

应该包含以下目录及文件:

libs为所有依赖,另外两个json文件上面提过,一个加载class文件,一个生成配置;

运行:python datax.py -r txtfilereader -w txtFileWriter;

 据说功能很强大,还在摸索中~~~

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值