DataX 同步mysql到clickhouse

上一篇文章介绍了如何编译DataX,这一篇介绍如何通过DataX同步数据。以 mysql 和 clickhouse 为例

DataX 可以用来做全量的数据迁移;如果要用 DataX 做增量同步,则需要额外带一个时间戳字段

进入可执行目录

首先进入到 target/datax/datax/bin 目录下,可以看到3个python文件

  • datax.py
  • dxprof.py
  • perftrace.py

在这里插入图片描述

制作job配置文件

DataX完成单个数据同步的作业,我们称之为Job,DataX接受到一个Job之后,将启动一个进程来完成整个作业同步过程。DataX Job模块是单个作业的中枢管理节点,承担了数据清理、子任务切分(将单一作业计算转化为多个子Task)、TaskGroup管理等功能。

生成模板

执行 python datax.py -r {YOUR_READER} -w {YOUR_WRITER},然后将控制台生成的模板,保存到 datax的job目录下,存为一个json文件。也可以执行 python datax.py -r {YOUR_READER} -w {YOUR_WRITER} > ../job/test.json 直接将输出重定至到文件中
在这里插入图片描述模板如下

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader", 
                    "parameter": {
                        "column": [], 
                        "connection": [
                            {
                                "jdbcUrl": [], 
                                "table": []
                            }
                        ], 
                        "password": "", 
                        "username": "", 
                        "where": ""
                    }
                }, 
                "writer": {
                    "name": "clickhousewriter", 
                    "parameter": {
                        "batchByteSize": 134217728, 
                        "batchSize": 65536, 
                        "column": [
                            "col1", 
                            "col2", 
                            "col3"
                        ], 
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:clickhouse://<host>:<port>[/<database>]", 
                                "table": [
                                    "table1", 
                                    "table2"
                                ]
                            }
                        ], 
                        "dryRun": false, 
                        "password": "password", 
                        "postSql": [], 
                        "preSql": [], 
                        "username": "username", 
                        "writeMode": "insert"
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": ""
            }
        }
    }
}

根据实际数据库修改模板

修改好的模板如下(使用 cat ../job/mysql2clickhouse.json | xsel -i -b 可以将文件的内容复制到剪贴板)

{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mysqlreader", 
                    "parameter": {
                        "column": [
				"id",
				"testTime",
				"dbtype",
				"tbname",
				"nrows",
				"ncols",
				"abbr",
				"cmd",
				"cost",
				"memG"
			], 
                        "connection": [
                            {
                                "jdbcUrl": ["jdbc:mysql://***.***.***.***:13306/dbtest?useUnicode=true&characterEncoding=utf-8&useSSL=false"], 
                                "table": [
					"exec"
				]
                            }
                        ], 
                        "password": "******", 
                        "username": "root", 
                        "where": ""
                    }
                }, 
                "writer": {
                    "name": "clickhousewriter", 
                    "parameter": {
                        "batchByteSize": 134217728, 
                        "batchSize": 65536, 
                        "column": [
                            "id",
                            "testTime",
                            "dbtype",
                            "tbname",
                            "nrows",
                            "ncols",
                            "abbr",
                            "cmd",
                            "cost",
                            "memG"
                        ], 
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:clickhouse://***.***.***.***:8123/test2", 
                                "table": [
                                    "exec"
                                ]
                            }
                        ], 
                        "dryRun": false, 
                        "password": "******", 
                        "postSql": [], 
                        "preSql": [], 
                        "username": "root", 
                        "writeMode": "insert"
                    }
                }
            }
        ], 
        "setting": {
            "speed": {
                "channel": "5"
            }
        }
    }
}

运行job

运行 job 的命令如下(二选一)

  • python datax.py ../job/mysql2clickhouse.json
  • python datax.py --jvm="-Xms3G -Xmx3G" ../job/test.json

用户名和密码都是必填项

由于目标数据库可以使用默认用户名密码登录,因此配置文件中username和password就直接留空了。结果报了如下错误,说明DataX一定要你填个用户名密码,不然无法正常执行。
在这里插入图片描述

JDBC的额外配置参数

不建议在没有服务器身份验证的情况下建立SSL连接。根据MySQL 5.5.45+、5.6.26+和5.7.6+的要求,如果不设置显式选项,则必须建立默认的SSL连接。您需要通过设置useSSL=false显式地禁用SSL,或者设置useSSL=true并为服务器证书验证提供信任存储

jdbc:mysql://127.0.0.1:3306/databaseName?useUnicode=true&characterEncoding=utf-8&useSSL=false
在这里插入图片描述

必须预先建表

直接执行job后,报如下错误。提示是因为目标数据库中没有这个表。因此在使用DataX进行数据同步时,必须在目标数据库预先建立对应的表结构。
在这里插入图片描述

column个数必须相同

配置的时候把源表的column全列出来了,由于仅需要抽取部分字段,因此目标column只配了部分。执行job,报如下错误。

说明 —— 在json配置文件中,源column的个数,必须与目标column的个数相同。
在这里插入图片描述

同步成功

在这里插入图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
要在DataX同步 ClickHouse 的 null 值,你可以使用 DataX 的内置函数 `null` 或 `NULL`。这些函数可以用来表示源数据中的空值,并将其正确地映射到 ClickHouse 的 null 值。 以下是一个示例配置文件,展示了如何在 DataX 中将 null 值同步ClickHouse: ```json { "job": { "setting": { ... }, "content": [ { "reader": { ... }, "writer": { ... } } ] } } ``` 在上述示例中,你需要根据你的具体情况配置读取器(reader)和写入器(writer)。假设你正在使用 MySQL 作为源数据库,你可以在读取器配置中添加以下代码片段来指定 null 值的映射: ```json "reader": { "name": "mysqlreader", "parameter": { ... "nullFormat": "\\N" } } ``` 在上述代码中,`nullFormat` 参数被设置为 "\\N",这是 MySQL 中用于表示 null 值的默认格式。 接下来,在写入器(writer)配置中,你需要将列映射为 ClickHouse 表的字段,并使用 `null` 或 `NULL` 函数将源数据中的空值映射为 ClickHouse 的 null 值。以下是一个示例代码片段: ```json "writer": { "name": "clickhousewriter", "parameter": { ... "column": [ { "name": "column1", "type": "String", "value": "null" }, { "name": "column2", "type": "Int32", "value": "NULL" } ] } } ``` 在上述代码中,`column` 数组中的每个元素表示一个 ClickHouse 表的字段。你可以使用 `null` 或 `NULL` 函数将值设置为 null。 请根据你的具体情况修改以上示例配置文件,确保正确地映射 null 值并进行同步
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值