DataX的知识碎片

yulugoat / 2024-07-10 / 原文

DATAX概览

DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。

  • 设计理念

    为了解决异构数据源同步问题,DataX将复杂的网状的同步链路变成了星型数据链路,DataX作为中间传输载体负责连接各种数据源。当需要接入一个新的数据源的时候,只需要将此数据源对接到DataX,便能跟已有的数据源做到无缝数据同步。

  • 当前使用现状

    DataX在阿里巴巴集团内被广泛使用,承担了所有大数据的离线同步业务,并已持续稳定运行了6年之久。目前每天完成同步8w多道作业,每日传输数据量超过300TB。

DataX框架设计

DataX本身作为离线数据同步框架,采用Framework + plugin架构构建。将数据源读取和写入抽象成为Reader/Writer插件,纳入到整个同步框架中。

  • Reader:Reader为数据采集模块,负责采集数据源的数据,将数据发送给Framework。
  • Writer: Writer为数据写入模块,负责不断向Framework取数据,并将数据写入到目的端。
  • Framework:Framework用于连接reader和writer,作为两者的数据传输通道,并处理缓冲,流控,并发,数据转换等核心技术问题。

DataX插件体系

经过几年积累,DataX目前已经有了比较全面的插件体系,主流的RDBMS数据库、NOSQL、大数据计算系统都已经接入。DataX目前支持数据如下:

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

DataX Framework提供了简单的接口与插件交互,提供简单的插件接入机制,只需要任意加上一种插件,就能无缝对接其他数据源。

DataX核心架构

核心模块介绍:

  1. DataX完成单个数据同步的作业,我们称之为Job,DataX接受到一个Job之后,将启动一个进程来完成整个作业同步过程。DataX Job模块是单个作业的中枢管理节点,承担了数据清理、子任务切分(将单一作业计算转化为多个子Task)、TaskGroup管理等功能。
  2. DataXJob启动后,会根据不同的源端切分策略,将Job切分成多个小的Task(子任务),以便于并发执行。Task便是DataX作业的最小单元,每一个Task都会负责一部分数据的同步工作。
  3. 切分多个Task之后,DataX Job会调用Scheduler模块,根据配置的并发数据量,将拆分成的Task重新组合,组装成TaskGroup(任务组)。每一个TaskGroup负责以一定的并发运行完毕分配好的所有Task,默认单个任务组的并发数量为5。
  4. 每一个Task都由TaskGroup负责启动,Task启动后,会固定启动Reader—>Channel—>Writer的线程来完成任务同步工作。
  5. DataX作业运行起来之后, Job监控并等待多个TaskGroup模块任务完成,等待所有TaskGroup任务完成后Job成功退出。否则,异常退出,进程退出值非0

DataX调度流程:

举例来说,用户提交了一个DataX作业,并且配置了25个并发,目的是将一个100张分表的mysql数据同步到odps里面。 DataX的调度决策思路是:

  1. DataXJob根据分库分表切分成了100个Task。
  2. 根据25个并发,DataX计算共需要分配4个TaskGroup
  3. 4个TaskGroup平分切分好的100个Task,每一个TaskGroup负责以5个并发共计运行25个Task。

DataX六大核心优势

  • 可靠的数据质量监控

    • 完美解决数据传输个别类型失真问题
    • 提供作业全链路的流量、数据量运行时监控
    • 提供脏数据探测
  • 丰富的数据转换功能

    DataX作为一个服务于大数据的ETL工具,除了提供数据快照搬迁功能之外,还提供了丰富数据转换的功能,让数据在传输过程中可以轻松完成数据脱敏,补全,过滤等数据转换功能,另外还提供了自动groovy函数,让用户自定义转换函数。

  • 精准的速度控制

    新版本DataX3.0提供了包括通道(并发)、记录流、字节流三种流控模式,可以随意控制你的作业速度,让你的作业在库可以承受的范围内达到最佳的同步速度。

    "speed": {
       "channel": 5,
       "byte": 1048576,
       "record": 10000
    }
    
  • 强劲的同步性能

    DataX3.0每一种读插件都有一种或多种切分策略,都能将作业合理切分成多个Task并行执行,单机多线程执行模型可以让DataX速度随并发成线性增长。在源端和目的端性能都足够的情况下,单个作业一定可以打满网卡。另外,DataX团队对所有的已经接入的插件都做了极致的性能优化,并且做了完整的性能测试

  • 健壮的容错机制

    DataX作业是极易受外部因素的干扰,网络闪断、数据源不稳定等因素很容易让同步到一半的作业报错停止。因此稳定性是DataX的基本要求,在DataX 3.0的设计中,重点完善了框架和插件的稳定性。目前DataX3.0可以做到线程级别、进程级别(暂时未开放)、作业级别多层次局部/全局的重试,保证用户的作业稳定运行。

    • 线程内部重试
    • 线程级别重试
  • 极简的使用体验

    • 易用

    • 详细

      DataX在运行日志中打印了大量信息,其中包括传输速度,Reader、Writer性能,进程CPU,JVM和GC情况等等。

      • 传输过程中打印传输速度、进度等
      • 传输过程中会打印进程相关的CPU、JVM等
      • 在任务结束之后,打印总体运行情况

DataX与Sqoop对比

功能 DataX Sqoop
运行模式 单进程多线程 MR
分布式 不支持,可以通过调度系统规避 支持
流控 有流控功能 需要定制
统计信息 已有一些统计,上报需定制 没有,分布式的数据收集不方便
数据校验 在core部分有校验功能 没有,分布式的数据收集不方便
监控 需要定制 需要定制

DataX使用

模板介绍

生成模板的命令
datax.py -r mysqlreader -w hdfswriter
{
 "job": {
     "content": [
         {
             "reader": {
                 "name": "mysqlreader", 
                 "parameter": {
                     "column": [
                         "列"
                     ], 
                     "connection": [
                         {
                             "jdbcUrl": ["url"], 
                             "table": ["tablename"]
                         }
                     ], 
                     "password": "", 
                     "username": "", 
                     "where": ""
                 }
             }, 
             "writer": {
                 "name": "hdfswriter", 
                 "parameter": {
                     "column": [
                         "列"
                     ], 
                     "compress": "是否需要压缩", 
                     "defaultFS": "", 
                     "fieldDelimiter": ",", 
                     "fileName": "tablename", 
                     "fileType": "text/orc", 
                     "path": "hdfs", 
                     "writeMode": "insert/overwrite"
                 }
             }
         }
     ], 
     "setting": {
         "speed": {
             "channel": "1/2/.."
         }
     }
 }
}

1、使用说明

  1. DataX任务提交命令

    DataX的使用十分简单,用户只需根据自己同步数据的数据源和目的地选择相应的Reader和Writer,并将Reader和Writer的信息配置在一个json文件中,然后执行如下命令提交数据同步任务即可。

    python ./bin/datax.py ./job/job.json
    
    
    datax.py xxx.json
    
  2. DataX配置文件格式

    编写json文件的步骤:

    1、根据你确定的reader和writer来使用命令生成对应的模板

    2、去github上找到对应参数值的写法,主要是看参数是否是必须项,有什么影响

DataX基本使用

  1. mysql2mysql(数据迁移)

    生成Mysql到Mysql同步的模板:

    {
        "job": {
            "content": [
                {
                    "reader": {
                        "name": "mysqlreader", 
                        "parameter": {
                            "column": ["*"], 
                            "connection": [
                                {
                                    "jdbcUrl": ["jdbc:mysql://master:3306/yourdb?useUnicode=true&characterEncoding=utf-8"], 
                                    "table": [tablename]
                                }
                            ], 
                            "password": "******", 
                            "username": "******", 
                            "where": "where条件"
                        }
                    }, 
                    "writer": {
                        "name": "mysqlwriter", 
                        "parameter": {
                            "column": [
                            "col1"...
                            ], 
                            "connection": [
                                {
                                    "jdbcUrl": "jdbc:mysql://master:3306/yourdb?useUnicode=true&characterEncoding=utf-8", 
                                    "table": ["tablename"]
                                }
                            ], 
                            "password": "******",, 
                            "preSql": [], 
                            "session": [], 
                            "username": "******",, 
                            "writeMode": "insert/overwrite"
                        }
                    }
                }
            ], 
            "setting": {
                "speed": {
                    "channel": "1"
                }
            }
        }
    }
    
    

    使用datax之前需要先建表

    datax.py mysql2mysql.json
    
  2. mysql2hdfs

    查看模板

    datax.py -r mysqlreader -w hdfswriter
    
    {
        "job": {
            "content": [
                {
                    "reader": {
                        "name": "mysqlreader", 
                        "parameter": {
                            "column": ["*"], 
                            "connection": [
                                {
                                    "jdbcUrl": ["jdbc:mysql://master:3306/yourdb?useUnicode=true&characterEncoding=utf-8"], 
                                    "table": [tablename]
                                }
                            ], 
                            "password": "******", 
                            "username": "******", 
                            "where": ""
                        }
                    }, 
                    "writer": {
                        "name": "hdfswriter", 
                        "parameter": {
                            "column": [
                                {
                                 "name": "col1",
                                 "type": "string"
                         		},
                                {
                                 "name": "col2",
                                 "type": "string"
                         		}
                            ], 
                            "compress": "", 
                            "defaultFS": "hdfs://master:9000", 
                            "fieldDelimiter": ",", 
                            "fileName": "tablename", 
                            "fileType": "text", 
                            "path": "yourpath", 
                            "writeMode": "append"
                        }
                    }
                }
            ], 
            "setting": {
                "speed": {
                    "channel": "1"
                }
            }
        }
    }
    

    执行之前需要先建表

    执行同步任务

    datax.py mysql2hdfs.json
    
  3. mysql2hive

    (1)、目前HdfsWriter仅支持textfile和orcfile两种格式的文件,且文件内容存放的必须是一张逻辑意义上的二维表;
    (2)、由于HDFS是文件系统,不存在schema的概念,因此不支持对部分列写入;
    (3)、目前仅支持与以下Hive数据类型: 数值型:TINYINT,SMALLINT,INT,BIGINT,FLOAT,DOUBLE 字符串类型:STRING,VARCHAR,CHAR 布尔类型:BOOLEAN 时间类型:DATE,TIMESTAMP 目前不支持:decimal、binary、arrays、maps、structs、union类型;
    (4)、对于Hive分区表目前仅支持一次写入单个分区;
    (5)、对于textfile需用户保证写入hdfs文件的分隔符与在Hive上创建表时的分隔符一致,从而实现写入hdfs数据与Hive表字段关联;
    (6)、HdfsWriter实现过程是:首先根据用户指定的path,创建一个hdfs文件系统上不存在的临时目录,创建规则:path_随机;然后将读取的文件写入这个临时目录;全部写入后再将这个临时目录下的文件移动到用户指定目录(在创建文件时保证文件名不重复); 最后删除临时目录。如果在中间过程发生网络中断等情况造成无法与hdfs建立连接,需要用户手动删除已经写入的文件和临时目录。
    

    查看模板

    datax.py -r mysqlreader -w hdfswriter
    

    创建hive数据库

    create database dataxinfo;
    

    创建表

    CREATE TABLE IF NOT EXISTS xuqiu1(
        id STRING,
        name STRING,
        sum_score bigint,
        clazz STRING
    )
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ',';
    

    编写配置文件mysql2hdfs2.json

    {
        "job": {
            "content": [
                {
                    "reader": {
                        "name": "mysqlreader", 
                        "parameter": {
                            "column": ["*"], 
                            "connection": [
                                {
                                    "jdbcUrl": ["jdbc:mysql://master:3306/db?useUnicode=true&characterEncoding=utf-8"], 
                                    "table": ["new_students"]
                                }
                            ], 
                            "password": "******", 
                            "username": "******"
                        }
                    }, 
                    "writer": {
                        "name": "hdfswriter", 
                        "parameter": {
                            "column": [
                                {
                                 "name": "id",
                                 "type": "int"
                         		},
                                {
                                 "name": "name",
                                 "type": "string"
                         		},
                                {
                                 "name": "email",
                                 "type": "string"
                         		},
                                {
                                 "name": "age",
                                 "type": "int"
                         		}
                            ], 
                            "defaultFS": "hdfs://master:9000", 
                            "fieldDelimiter": ",", 
                            "fileName": "new_students", 
                            "fileType": "text", 
                            "path": "/user/hive/warehouse/dataxinfo.db/new_students", 
                            "writeMode": "append"
                        }
                    }
                }
            ], 
            "setting": {
                "speed": {
                    "channel": "1"
                }
            }
        }
    }
    

    执行同步任务

    datax.py mysql2hdfs2.json
    

此外还有MySQL2Hive、hive2mysql、mysql2hbase等。。。。