文档

迁移ClickHouse数据到StarRocks

更新时间:

本文为您介绍如何迁移EMR ClickHouse中的数据至EMR Serverless StarRocks实例。

前提条件

  • 已创建Serverless StarRocks实例,详情请参见创建实例

  • 已在EMR on ECS上创建包含ClickHouse服务的OLAP集群,详情请参见创建集群,或新建云数据库ClickHouse集群,详情请参见新建集群

    说明

    本文以在EMR on ECS上创建包含ClickHouse服务的集群(OLAP)为例。

使用限制

EMR Serverless StarRocks实例和OLAP集群需要在同一VPC下。

使用DataX同步数据

DataX介绍

DataX是阿里巴巴集团内被广泛使用的离线数据同步工具,实现了包括MySQL、Oracle、OceanBase、SqlServer、PostgreSQL、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS等各种异构数据源之间高效的数据同步功能。DataX详细信息,请参见DataX

适用场景

适用于熟悉DataX、迁移批量数据的场景,可以一次迁移大批量数据至EMR StarRocks Serverless。

操作步骤

  1. 下载并解压缩DataX安装包

    DataX的具体使用方式请参见DataX

  2. 配置RDBMSReader。

    说明

    RDBMSReader是DataX内置的一个通用的关系数据库读插件,可以通过添加、注册数据库驱动等方式增加各种关系型数据库的读支持。

    1. 复制datax/plugin/writer/clickhousewriter/libs目录下的所有JAR包到datax/plugin/reader/rdbmsreader/libs目录下。

      cp datax/plugin/writer/clickhousewriter/libs/* datax/plugin/reader/rdbmsreader/libs
  3. 删除datax/plugin/reader/rdbmsreader/libs目录下的guava-r05.jar。

  4. 修改datax/plugin/reader/rdbmsreader下的plugin.json文件,给drivers的参数值添加上,"ru.yandex.clickhouse.ClickHouseDriver"

    {
      "name": "rdbmsreader",
      "class": "com.alibaba.datax.plugin.reader.rdbmsreader.RdbmsReader",
      "description": "useScene: prod. mechanism: Jdbc connection using the database, execute select sql, retrieve data from the ResultSet. warn: The more you know about the database, the less problems you encounter.",
      "developer": "alibaba",
      "drivers":["dm.jdbc.driver.DmDriver", "com.sybase.jdbc3.jdbc.SybDriver", "com.edb.Driver","ru.yandex.clickhouse.ClickHouseDriver"]
    }
  5. 配置StarRocks Writer。

    StarRocks Writer的配置方式,请参见DataX Writer

  6. 配置DataX的JSON脚本。

    为导入作业新建一个JSON格式的文件ck2strs.json

    {
      "job": {
        "setting": {
          "speed": {
            "channel": 3
          },
          "errorLimit": {
            "record": 0,
            "percentage": 0
          }
        },
        "content": [
          {
            "reader": {
              "name": "rdbmsreader",
              "parameter": {
                "username": "default",
                "password": "**",
                "column": ["**"],
                "connection": [
                  {"jdbcUrl": ["jdbc:clickhouse://<clickhouse_host>:8123/default"],
                    "table": ["**"]
                  } ],
                "where": ""
              }
            },
            "writer": {
              "name": "starrockswriter",
              "parameter": {
                "username": "admin",
                "password": "**",
                "database": "ck",
                "table": "uk_price_paid_sr",
                "column": ["**"],
                "preSql": [],
                "postSql": [],
                "jdbcUrl": "jdbc:mysql://<fe_host>:<fe_query_port>",
                "loadUrl": [
                  "<fe_host>:<fe_http_port>",
                  "<fe_host>:<fe_http_port>",
                  "<fe_host>:<fe_http_port>"
                ],
                "loadProps": {
                  "column_separator": "\\x03",
                  "row_delimiter": "\\x02"
                }
              }
            }
          }
        ]
      }
    }
    

    各参数含义如下表所示。

    • reader

      参数

      说明

      username

      ClickHouse用户名。本文使用的是ClickHouse部署完后的默认用户default,密码默认值为空。如果需要更换用户,请根据您的实际情况修改并设置相应的密码。

      password

      ClickHouse用户的密码。默认用户default对应的密码为空。

      column

      可以指定需要查询的列。

      jdbcUrl

      JDBC连接串。填写格式为jdbc:clickhouse://<clickhouse_host>:<clickhouse_port>/<database_name>

      格式中各参数如下:

      • <clickhouse_host>:ClickHouse的IP地址。

      • <clickhouse_port>:官方驱动的端口默认为8123。如果使用TCP协议的第三方驱动,则默认端口为9000。

      • <database_name>:ClickHouse的数据库名。

      table

      ClickHouse的表名称。

    • writer

      参数

      说明

      username

      StarRocks的管理员用户,默认为admin。

      password

      admin的密码。

      database

      StarRocks数据库的名称。

      table

      StarRocks表的名称。

      column

      可以指定需要查询的列。多个字段时之间用英文逗号(,)分隔。例如,"column": ["id","name","age"]

      重要

      该参数必须指定。如果希望导入所有字段,可以使用["*"]

      preSql

      写入数据到目的表前,会先执行设置的标准语句。

      postSql

      写入数据到目的表后,会先执行设置的标准语句。

      jdbcUrl

      JDBC连接信息,用于执行preSqlpostSql。填写格式为jdbc:mysql://<fe_host>:<fe_query_port>

      loadUrl

      StarRocks FE的地址,填写格式为<fe_host>:<fe_http_port>

  7. 执行同步任务。

    python datax/bin/datax.py --jvm="-Xms1G -Xmx1G" -p"-Dstart=$i -Dend=$end" datax/job/ck2strs.json>>/bigdata/log/ck2strs/${i}.log
    说明
    • 示例代码中的Xms和Xmx ,通常建议将内存设置为4G或者8G,可根据任务机的实际配置,提升-Xms与-Xmx,来防止OOM。

    • 调整JVM Xms和Xmx参数的两种方式:一种是直接更改datax.py;另一种是在启动的时候,加上对应的参数,例如python datax/bin/datax.py --jvm="-Xms8G -Xmx8G"XXX.json

使用StarRocks外部表同步数据

方案介绍

该方案是通过StarRocks的外部表,将源集群数据同步至目标集群;通过JDBC方式,在目标集群创建目标表,在源集群创建外部表,将数据插入外部表实现数据迁移。

适用场景

适用于单表数据迁移的场景。如果表数量大,则操作会比较繁琐,耗时较高。

操作步骤

  1. 创建JDBC资源。

    create external resource ck_jdbc
    properties (
        "type"="jdbc",
        "user"="default",
        "password"="****",
        "jdbc_uri"="jdbc:clickhouse://172.16.**.**:8123/test",
        "driver_url"="https://****.oss-cn-****-internal.aliyuncs.com/clickhouse-jdbc-0.3.2-all.jar",
        "driver_class"="com.clickhouse.jdbc.ClickHouseDriver"
    );

    相关参数如下表所示。

    参数

    说明

    ck_jdbc

    JDBC资源的名称。您可以自定义。

    type

    资源类型。固定值为jdbc。

    user

    ClickHouse用户名。本文使用的是ClickHouse部署完后的默认用户default,密码默认值为空。如果需要更换用户,请根据您的实际情况修改并设置相应的密码。

    password

    ClickHouse用户的密码。默认用户default对应的密码为空。

    jdbc_uri

    填写格式为jdbc:clickhouse://<clickhouse_host>:<clickhouse_port>/<database_name>

    格式中各参数如下:

    • <clickhouse_host>:ClickHouse的IP地址。

    • <clickhouse_port>:官方驱动的端口默认为8123。如果使用TCP协议的第三方驱动,则默认端口为9000。

    • <database_name>:ClickHouse的数据库名。

    driver_url

    OSS上存放驱动的内网地址。

    本示例使用的是官方驱动,下载clickhouse-jdbc-0.3.2-all.jar,然后上传至OSS。

    driver_class

    驱动类,默认为com.clickhouse.jdbc.ClickHouseDriver。

    创建完JDBC资源后,您还可以进行以下操作:

    • 查看JDBC资源

      -- 查看所有JDBC资源。
      -- 说明:ResourceType列为jdbc。
      SHOW RESOURCES;
    • 删除JDBC资源

      DROP RESOURCE "ck_jdbc";
      说明

      删除JDBC资源会导致使用该JDBC资源创建的JDBC外部表不可用,但目标数据库的数据并不会丢失。删除JDBC资源后,如果您仍需通过StarRocks查询目标数据库的数据,可以重新创建JDBC资源和JDBC外部表。

  2. 创建JDBC外部表。

    -- 创建外部表。
    create external table uk_price_paid_ex (
        price BIGINT(20) NULL COMMENT "",
        date String NULL COMMENT "",
        postcode1 String NULL COMMENT "",
        postcode2 String NULL COMMENT "",
        type String NULL COMMENT "",
        is_new BIGINT(20) NULL COMMENT "",
        duration String NULL COMMENT "",
        addr1 String NULL COMMENT "",
        addr2 String NULL COMMENT "",
        street String NULL COMMENT "",
        locality String NULL COMMENT "",
        town String NULL COMMENT "" ,
        district String NULL COMMENT "",
        county String NULL COMMENT "" 
    ) ENGINE=jdbc 
    properties (
        "resource"="ck_jdbc",
        "table"="uk_price_paid",
        "compression"="ZSTD"
    );
    说明
    • 不支持索引。

    • 不支持通过PARTITION BY、DISTRIBUTED BY来指定数据分布规则。

  3. 创建数据表。

    适用于所有数据模型。

    create table uk_price_paid (
        price BIGINT(20) NULL COMMENT "",
        date DATE NULL COMMENT "",
        postcode1 String NULL COMMENT "",
        postcode2 String NULL COMMENT "",
        type String NULL COMMENT "",
        is_new BIGINT(20) NULL COMMENT "",
        duration String NULL COMMENT "",
        addr1 String NULL COMMENT "",
        addr2 String NULL COMMENT "",
        street String NULL COMMENT "",
        locality String NULL COMMENT "",
        town String NULL COMMENT "" ,
        district String NULL COMMENT "",
        county String NULL COMMENT "" 
    ) ENGINE=OLAP
    duplicate key (price)
    distributed by hash(date) buckets 32
    properties(
        "replication_num"="1"
    );
  4. 插入数据。

    insert into uk_price_paid select * from uk_price_paid_ex;

常见问题

  • 问题报错

    ERROR 1064 (HY000): Type is not supported on column[date1], JDBC result type is [java.time.LocalDate]

    操作详情如下图所示。

    image..png
  • 解决方式

    该问题主要是ClickHouse和StarRocks的date字段类型不匹配导致的。您可以先修改ClickHouse表中的date字段类型为String或其他类型,然后设置StarRocks目标表为DATE类型,最后数据插入StarRocks目标表时会自动转换类型。

  • 本页导读 (1)
文档反馈