使用Datax将MySQL中的数据导入到TableStore中

本文介绍了一种将接近亿级别的数据从MySQL迁移至阿里云TableStore的方法。通过使用DataX插件并结合一键部署工具实现了高效迁移。文章还提供了详细的配置步骤及性能调优建议。

背景

由于我们的数据在MySQL中的数据已经快接近亿级别,在访问MySQL并发读写的时候遇到了很大的瓶颈,严重的Block了我们的业务发展,主要从白天十点到晚上十点之前,并发访问的用户比较多,我们在写的前面加上了队列,系统后台自动同步。但是读上没有很好的办法解决,所以我们急需一个有较高吞吐量的实时存储系统。

本来准备自己搭建Hbase集群,但是考虑到运维代价和成本,最终放弃了这个方案。后面给阿里云发工单,了解到阿里云有一个类似于Hbase的产品,叫做TableStore,简单看了一下,总结一下优势:高并发、低延迟、按量计费、全托管。经历了一段时间的调研和使用之后,发现能满足我们业务需求,最终决定选用TableStore。

业务代码改造完成之后,需要将历史数据同步过去,使用了阿里开源的Datax插件,因此把整个迁移流程记录下来,分享给大家。

使用一键部署工具迁移数据

# 简单的5步实现数据迁移
# 下载包

# 第一步,下载一键部署包
git clone https://github.com/red-chen/one_key_install_datax.git

# 第二步,安装Datax
cd one_key_install_datax
sh datax.sh install

# 第三步,修改配置 (可以参考下面的样例进行配置,如果需要更高级的特性,请直接查看插件的帮助文档)
vim mysql_to_ots.json

# 第四步,运行
sh datax.sh run mysql_to_ots.json

# 第五步,等待执行完毕
任务启动时刻                    : 2016-06-30 00:00:00
任务结束时刻                    : 2016-06-30 16:00:00
任务总计耗时                    :              57600s
任务平均流量                    :               1.2M/s
记录写入速度                    :            1736rec/s
读出记录总数                    :           100000000
读写失败总数                    :                   0

准备插件

配置模板

  • 请自行修改{}中的内容
{
    "job": {
        "setting": {
            "speed": {
                "channel": "1"
            }
        },
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",    
                    "parameter": {
                        "username": "{username}",
                        "password": "{passwd}",
                        "checkSlave":true,
                        "column": [
                            "{column_name}"
                        ],
                        "splitPk": "{pk}",
                        "connection": [
                            {
                                "table": [
                                    "{table_name}"
                                ],
                                "jdbcUrl": ["jdbc:mysql://{MySQL_HOST}:{MySQL_PORT}/{Database}"]
                            }
                        ]
                    }
                },
               "writer": {
                    "name": "otswriter",
                    "parameter": {
                        "endpoint":"{endpointnt}",
                        "accessId":"{accessId}",
                        "accessKey":"{accessKey}",
                        "instanceName":"{instanceName}",
                        "table":"{table}",
                        "primaryKey" : [
                            {"name":"{column_name}", "type":"{column_type}"}
                        ],
                        "column" : [
                            {"name":"{column_name}", "type":"{column_type}"}
                        ],
                        "writeMode" : "PutRow"
                    }
                }
            }
        ]
    }
}

样例

MySQL中的表
user_idtypedescinstance_countcreate_time
12009091persion李渊博31467258591
12009092company北京天启传播有限公司451460253572
  • | | | |
  • | | | |
  • | | | |
  • | | | |
  • 字段描述:

    • user_id 字符串
    • type 字符串
    • desc 字符串
    • instance_count 数值
    • create_time 数值
TableStore中的表

因为user_id是全局唯一的,所以我们只需要在TableStore创建一个PK为user_id的表即可,属性列不用创建,写入的时候直接创建

user_id
MySQL账户
  • host: tudou-user-rds.rds.cn-beiging.aliyun.com
  • port: 3163
  • user: root
  • passwd: 123456
  • db: meta
  • table: user_info
TableStore账户
样例配置
{
    "job": {
        "setting": {
            "speed": {
                "channel": "1"
            }
        },
        "content": [
            {
                "reader": {
                    "name": "mysqlreader",    
                    "parameter": {
                        "username": "root",
                        "password": "123456",
                        "checkSlave":true,
                        "column": [
                            "user_id", "type", "desc", "instance_count", "create_time"
                        ],
                        "splitPk": "user_id",
                        "connection": [
                            {
                                "table": [
                                    "user_info"
                                ],
                                "jdbcUrl": ["jdbc:mysql://tudou-user-rds.rds.cn-beiging.aliyun.com:3163/meta"]
                            }
                        ]
                    }
                },
               "writer": {
                    "name": "otswriter",
                    "parameter": {
                        "endpoint":"http://tudou-user.ots.cn-beiging.aliyun.com",
                        "accessId":"testaccessid",
                        "accessKey":"testaccesskey",
                        "instanceName":"tudou-user",
                        "table":"user_info",
                        "primaryKey" : [
                            {"name":"user_id", "type":"string"}
                        ],
                        "column" : [
                            {"name":"type", "type":"string"},
                            {"name":"desc", "type":"string"},
                            {"name":"instance_count", "type":"int"},
                            {"name":"create_time", "type":"int"}
                        ],
                        "writeMode" : "PutRow"
                    }
                }
            }
        ]
    }
}

性能调优

  • 前期工作和注意点

    • 因为我们数据量比较大,所以在启动迁移之前,我们通过工单主动联系了TableStore的工程师,帮我们把表按照第一列的数据范围拆分了多个分区,加快了数据的导入速度。
    • 在测试的时候,切记不要构造大量的数据,我们在测试的时候没有太注意,测试工程师搞了1千万的数据导入到TableStore中,因为TableStore是按量计费的,导致多交了很多钱!!
  • 在迁移的数据的时候,怎么调整速度?

    • 如果觉得导入速度太慢,可以适当的加大Channel数目,Channel的意义表示启动Datax的并发任务数目
  • 我在源DB上的数据类型是string,到目标源是否能强转为Int?

    • Datax使用了标准的Java转义方式,细节可以参考Java转义
<think>我们正在讨论如何使用DataX数据导入MySQL。根据引用内容,我们知道DataX是阿里开源的数据同步工具,支持多种数据源和目标。特别地,引用[1]提到DataX可以实现从HDFS导入MySQL,速度快,支持增量全量,可以分表。引用[2]提到涛思数据基于DataX开发了TDengine的插件,说明DataX的插件机制可以扩展。引用[3]则给出了一个MySQL建表语句的示例,提醒我们在导入前需要确保目标表结构正确。用户需求:使用DataX数据导入MySQL。步骤:1.准备环境:安装DataX。2.编写DataX作业配置文件(json格式),配置reader(数据源)和writer(目标,即MySQL)。3.运行DataX作业。具体配置示例(以从文本文件导入MySQL为例,但DataX支持多种reader,如MySQL,Oracle,HDFS,Hive等):假设我们有一个文本文件(例如CSV)作为数据源,目标为MySQL。但用户没有指定数据源,所以我们需要考虑常见的数据源(如文本文件、Hive、HDFS、其他数据库等)。由于引用[1]提到从hive查询存储到文件再导入,而DataX可以直接从Hive读(通过HDFSReader或Hive Reader)?注意:DataX本身没有直接提供HiveReader,但可以通过HDFSReader读取Hive表在HDFS上的存储文件(如textfile,orc等),或者通过RDBMS Reader(如MySQLReader)读取Hive的JDBC服务(如果HiveServer2开启)。不过,更常见的是使用HDFS Reader读取Hive表数据。这里我们以从HDFS导入MySQL为例(因为引用[1]提到),但用户可能的数据源多种多样,我们给出一个通用的配置方法。配置模板:{"job": {"content":[{"reader": {"name":"hdfsreader",//数据源为HDFS"parameter": {"path":"/user/hive/warehouse/table_name/*", //HDFS路径"defaultFS":"hdfs://namenode:port","column": [{"index":0,"type": "string"},//按列索引,假设第一列是字符串{"index":1,"type": "int"},//...其他列],"fileType":"text",//文本文件,也可以是orc, rc等"encoding":"UTF-8","fieldDelimiter":"\t"//如果是CSV,可能是逗号//其他参数}},"writer": {"name":"mysqlwriter","parameter":{"writeMode":"insert",//插入模式,也可以是replace,update"username":"root","password": "password","column":["col1","col2",...],//目标表的列名"connection":[{"table": ["table_name"],//目标表名"jdbcUrl": "jdbc:mysql://mysql_host:port/database_name"}]}}}],"setting": {"speed":{"channel": "3"//并发数}}}}但是,如果数据源是MySQL或其他数据库,则更换reader即可。例如,从另一个MySQL数据库导入,则使用mysqlreader。注意事项:1.目标表需要提前创建好,表结构要与数据源对应(如引用[3]所示)。2.字段类型映射:DataX会尝试自动映射,但可能需要手动调整。3.增量同步:通常通过where条件过滤增量数据(在reader中配置querySql或where参数)。4.性能调优:调整channel数量(并发数),batchSize等。操作步骤:1.下载并安装DataX(解压即可用)。2.编写配置文件(如job.json)。3.执行命令:pythonbin/datax.py job.json如果用户的数据源是Hive,那么有两种方式:方式一:通过HDFSReader读取Hive表在HDFS上的文件(需要知道文件格式和路径)。方式二:通过Hive的JDBC服务,使用DataX的rdbmsreader(需配置jdbc连接,HiveServer2服务)。方式一示例(HDFSReader):reader配置为hdfsreader,参数中指定路径、文件格式、列分隔符等(需要与Hive表存储格式一致)。方式二示例(RDBMSReader,这里用mysqlreader的配置方式,但实际Hive需要配置为hivereader?注意:DataX官方没有提供hivereader,所以通常使用HDFSReader或自定义插件。但是,我们可以使用通用的关系型数据库reader(如使用Hive的JDBC驱动)来读取,这时需要将reader的name设为`rdbmsreader`,然后配置jdbcUrl为Hive的JDBC连接串,driverClass为org.apache.hive.jdbc.HiveDriver,以及查询SQL。不过,DataX官方支持的reader和writer列表可以在其文档中查看。目前(DataX3.0)官方支持的reader有:MySQL, Oracle, SQLServer,PostgreSQL,HDFS, Hbase等,但没有直接列出Hive。因此,从Hive导入通常采用HDFSReader读取文件。另外,引用[1]提到,使用DataX可以避免产生临时文件,直接导入。因此,根据用户需求,我们给出一个从HDFS(代表Hive表数据)导入MySQL的示例配置。但是,用户的问题没有明确数据源,所以我们需要用户明确数据源类型。不过,这里我们假设数据源是Hive(存储在HDFS上)。步骤总结:1.在MySQL中创建目标表(如引用[3]所示,注意字段类型匹配)。2.编写DataX配置文件,reader使用hdfsreader(配置HDFS路径,文件格式,列分隔符,列类型等),writer使用mysqlwriter(配置MySQL连接信息,表名,列名等)。3.运行DataX。如果数据源是其他类型,更换reader即可。相关问题:1.如何安装DataX?2.如何配置DataX的HDFS Reader读取不同格式的文件(如ORC,Parquet)?3.如何实现增量导入?4.如何调优DataX同步速度?5.如何解决字段类型不匹配的问题?下面,我们按照要求生成相关问题。</think>### 如何使用 DataX数据导入 MySQL 以下是使用 DataX 实现数据同步到 MySQL 的完整步骤: #### 1. **环境准备** - 安装 [DataX 官方版本](https://github.com/alibaba/DataX) - 确保目标 MySQL 数据库已创建,且表结构与数据源匹配(参考引用[3]) - 安装 MySQL JDBC 驱动(将 `mysql-connector-java.jar` 放入 `DataX/lib` 目录) #### 2. **编写配置文件(JSON 格式)** ```json { "job": { "content": [{ "reader": { "name": "hdfsreader", // 数据源类型(可替换为mysqlreader、oraclereader等) "parameter": { "path": "/hive/warehouse/table", // HDFS路径 "defaultFS": "hdfs://namenode:8020", "fileType": "orc", // 文件格式(text/orc/parquet) "column": ["id", "name", "value"] // 源字段 } }, "writer": { "name": "mysqlwriter", "parameter": { "username": "root", "password": "your_password", "column": ["id", "name", "value"], // 目标字段 "connection": [{ "jdbcUrl": "jdbc:mysql://127.0.0.1:3306/test_db", "table": ["target_table"] // 目标表名 }], "writeMode": "insert" // 写入模式(insert/replace/update) } } }], "setting": { "speed": { "channel": 5 // 并发通道数 } } } } ``` #### 3. **关键配置说明** - **数据源适配**(根据源头调整 reader): - HDFS/Hive 数据使用 `hdfsreader`(需指定文件格式) - 其他 MySQL 数据库使用 `mysqlreader` - 文本文件:使用 `txtfilereader` - **MySQL 写入模式**: - `insert`:标准插入 - `replace`:主键冲突时替换 - `update`:主键冲突时更新 - **增量同步**:在 reader 中添加 `where` 条件(如 `"where": "update_time > '2023-01-01'"`) #### 4. **执行同步命令** ```bash python bin/datax.py path/to/your_job.json ``` #### 5. **性能优化建议** - 增大 `channel` 值提升并发(需测试数据库负载) - 对 MySQL 目标表提前创建索引 - 批量提交参数调整(在 writer 中添加 `"batchSize": 1024`) - 避免全表同步时使用 `"querySql"` 替代 `"table"` + `"column"` #### 6. **常见问题解决** - **字段类型不匹配**:在 writer 中通过 `"type": "varchar(255)"` 强制转换类型[^3] - **空值处理**:配置 `"nullFormat": "\\N"` - **连接超时**:在 jdbcUrl 后添加 `?connectTimeout=60000&socketTimeout=60000` > **注意**:DataX 支持多种数据源,通过替换 `reader` 组件可实现 Hive/Oracle/PostgreSQL 等系统到 MySQL 的迁移[^1][^2]。对于分表需求,可在 `table` 数组中配置多张表。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值