DataX的知识碎片
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核心架构
核心模块介绍:
- DataX完成单个数据同步的作业,我们称之为Job,DataX接受到一个Job之后,将启动一个进程来完成整个作业同步过程。DataX Job模块是单个作业的中枢管理节点,承担了数据清理、子任务切分(将单一作业计算转化为多个子Task)、TaskGroup管理等功能。
- DataXJob启动后,会根据不同的源端切分策略,将Job切分成多个小的Task(子任务),以便于并发执行。Task便是DataX作业的最小单元,每一个Task都会负责一部分数据的同步工作。
- 切分多个Task之后,DataX Job会调用Scheduler模块,根据配置的并发数据量,将拆分成的Task重新组合,组装成TaskGroup(任务组)。每一个TaskGroup负责以一定的并发运行完毕分配好的所有Task,默认单个任务组的并发数量为5。
- 每一个Task都由TaskGroup负责启动,Task启动后,会固定启动Reader—>Channel—>Writer的线程来完成任务同步工作。
- DataX作业运行起来之后, Job监控并等待多个TaskGroup模块任务完成,等待所有TaskGroup任务完成后Job成功退出。否则,异常退出,进程退出值非0
DataX调度流程:
举例来说,用户提交了一个DataX作业,并且配置了25个并发,目的是将一个100张分表的mysql数据同步到odps里面。 DataX的调度决策思路是:
- DataXJob根据分库分表切分成了100个Task。
- 根据25个并发,DataX计算共需要分配4个TaskGroup
- 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、使用说明
-
DataX任务提交命令
DataX的使用十分简单,用户只需根据自己同步数据的数据源和目的地选择相应的Reader和Writer,并将Reader和Writer的信息配置在一个json文件中,然后执行如下命令提交数据同步任务即可。
python ./bin/datax.py ./job/job.json datax.py xxx.json -
DataX配置文件格式
编写json文件的步骤:
1、根据你确定的reader和writer来使用命令生成对应的模板
2、去github上找到对应参数值的写法,主要是看参数是否是必须项,有什么影响
DataX基本使用
-
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 -
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 -
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等。。。。
浙公网安备 33010602011771号