迁移Doris数据

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

迁移Apache Doris数据到云数据库 SelectDB 版的方式主要有通过OSS、CatalogX2Doris三种。根据您的需要和业务场景,可以选择不同的方式进行数据迁移。本文为您介绍Apache Doris的离线数据迁移到云数据库 SelectDB 版的各个方式以及方式选择规则。

方式选择

根据不同的业务场景,选择合适您的迁移方式。具体的方式选择可以参考如下规则:

方式

适用场景

推荐原因

具体操作

导出导入OSS

数据存储在阿里云平台,且数据量大。

  • 可避免迁移使用的流量费用。

    说明

    DorisSelectDB在同一个Region内,迁移使用的是内网流量。

  • 可进行大量数据迁移。

通过导出导入OSS迁移

Catalog

数据存储在阿里云平台,且数据量小。

说明

包括阿里云EMR集群等场景。

  • 可避免迁移使用的流量费用。

    说明

    DorisSelectDB在同一个Region内,迁移使用的是内网流量。

  • 不需要依赖其他外部组件。

通过Catalog迁移

X2Doris

  • 期望迁移过程中使用尽可能少的SelectDB内部资源。

  • 期望进行一站式的库表结构迁移。

  • 迁移使用可视化平台,简单易用。

  • 使用内置的Spark,减少了迁移过程中SelectDB内部资源占用。

  • 迁移过程中允许进行库表结构定义。

X2Doris导入非Hive源的数据

本文将以Catalog和导出导入OSS方式,详细介绍如何迁移Doris的离线数据到SelectDB

通过导出导入OSS迁移

前提条件

  • OSS服务条件:

    • 已开通OSS服务。如何开通,请参见开通OSS服务

    • 访问OSSRAM用户已具备对OSS对象的读写权限。如何设置权限,请参见权限控制

  • 集群条件:

    已创建数据库账号。如何创建,请参见账号管理

准备工作

OSS服务创建存储空间(Bucket)。如何创建,请参见控制台创建存储空间

重要

确保OSS存储空间(Bucket)与您的云数据库 SelectDB 版实例在同一地域。

本文示例中Bucket的名为test-selectdb。

步骤一:导出源数据

  1. 登录源集群。

    自建Doris如何登录,请参见通过 MySQL 协议连接 - Apache Doris

  2. (可选)准备示例数据。

    如果您已有目标数据,可跳过此步骤。

    1. 建库。

      执行以下语句,创建数据库。

      CREATE DATABASE source_db;
    2. 建表。

      执行以下语句,建表。

      CREATE TABLE IF NOT EXISTS source_tb (
          `c1` int(11) NULL,
          `c2` string NULL,
          `c3` bigint NULL
      )
      DISTRIBUTED BY HASH(c1) BUCKETS 20
      PROPERTIES("replication_num" = "1");
    3. 写入示例数据。

      INSERT INTO source_tb VALUES
          (1, 'doris', 18),
          (2, 'nereids', 20),
          (3, 'pipelibe', 99999),
          (4, 'Apache', 122123455),
          (5, null, null);
    4. 验证写入数据。

      您可通过以下语句,验证示例数据。

      SELECT * FROM `source_tb` limit 10;

      结果如下。

      +--------------+--------------+--------------+
      | c1           | c2           | c3           |
      +--------------+--------------+--------------+
      | 1            | doris        | 18           |
      | 3            | pipelibe     | 99999        |
      | 5            |              |              |
      | 2            | nereids      | 20           |
      | 4            | Apache       | 122123455    |
      +--------------+--------------+--------------+
  3. 备份目标数据所在表的建表语句。

    您可通过SHOW CREATE TABLE语句查看目标表的建表语句,并备份。示例如下。

    SHOW CREATE TABLE source_tb ;

    结果如下。

    +-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table           | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
    +-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | source_tb       | CREATE TABLE `source_tb` (
                            `c1` int NULL,
                            `c2` text NULL,
                            `c3` bigint NULL
                          ) ENGINE=OLAP
                          DUPLICATE KEY(`c1`)
                          DISTRIBUTED BY HASH(`c1`) BUCKETS 20
                          PROPERTIES (
                          "file_cache_ttl_seconds" = "0",
                          "is_being_synced" = "false",
                          "storage_medium" = "hdd",
                          "storage_format" = "V2",
                          "inverted_index_storage_format" = "V2",
                          "light_schema_change" = "true",
                          "disable_auto_compaction" = "false",
                          "enable_single_replica_compaction" = "false",
                          "group_commit_interval_ms" = "10000",
                          "group_commit_data_bytes" = "134217728"
                          ); |
    +-----------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    返回行数: [1], 耗时: [22ms]
  4. 导出数据至OSS。

    通过EXPORT指令导出数据至OSS。

    语法如下。

    EXPORT TABLE table_name
    [PARTITION (p1[,p2])]
    [WHERE]
    TO export_path
    [opt_properties]
    WITH S3
    [s3_properties];

    参数说明如下。

    参数名称

    是否必填

    参数说明

    table_name

    当前要导出的表的表名。

    partition

    指定导出表的某些指定分区。

    where

    指定导出满足条件的表数据。

    export_path

    导出的文件路径。

    可以是目录,也可以是文件目录加文件前缀,如s3://path/to/my_file_

    opt_properties

    用于指定一些导出参数。详情请参见opt_properties语法与参数说明

    s3_properties

    用于配置S3协议相关属性。详情请参s3_properties语法与参数说明

    opt_properties语法如下。

    [PROPERTIES ("key"="value", ...)]

    可以指定如下参数。

    参数名称

    是否必填

    参数说明

    label

    指定此次Export任务的label,当不指定时系统会随机生成一个label。

    column_separator

    指定导出的列分隔符。

    默认为\t,支持多字节。该参数只用于csv文件格式。

    line_delimiter

    指定导出的行分隔符。

    默认为\n,支持多字节。该参数只用于csv文件格式。

    columns

    指定导出表的某些列。

    format

    指定导出作业的文件格式。

    支持的格式有parquet、orc、csv、csv_with_namescsv_with_names_and_types。

    默认为csv格式。

    max_file_size

    导出作业单个文件大小限制。如果结果超过这个值,将切割成多个文件。

    • 取值范围:[5 MB, 2 GB]

    • 默认值:1 GB

    当指定导出为ORC文件格式(即format_as参数为ORC)时,实际切分文件的大小是ceil (max_file_size/64) * 64 MB。

    parallelism

    导出作业的并发度,默认为1。

    导出作业会开启parallelism个数的线程去执行select into outfile语句。(如果parallelism个数大于表的tablets个数,系统会自动把parallelism设置为tablets个数大小,即每一个select into outfile语句负责一个tablets)。

    delete_existing_files

    是否删除目标路径下的所有文件。

    false(默认值):不删除目标路径下的文件。

    true:先删除export_path所指定目录下的所有文件,然后导出数据到该目录下。例如:

    • "file_path" = "/user/tmp",则会删除"/user/"下所有文件及目录。

    • "file_path" = "/user/tmp/",则会删除"/user/tmp/"下所有文件及目录。

    警告
    • 指定delete_existing_files = true是一个危险的操作,建议只在测试环境中使用。

    • 若要使用delete_existing_files参数,您可以向阿里云客服提工单,SelectDB技术团队在fe.conf配置文件中添加配置enable_delete_existing_files = true,并重启FE后,delete_existing_files才会生效。

    with_bom

    默认为false,若指定为true,则导出的文件编码为带有BOMUTF-8编码(只对csv相关的文件格式生效)。

    timeout

    导出作业的超时时间,默认为2小时,单位是秒。

    s3_properties语法如下。

    ("key"="value"[,...])

    可以指定如下参数。

    参数名称

    是否必选

    参数说明

    s3.endpoint

    使用S3协议目标的endpoint。

    本文示例为使用阿里云OSS迁移,则此处为访问OSS数据的Endpoint。如何获取,请参见OSS地域和访问域名

    重要

    请确保OSS存储空间(Bucket)与您的云数据库 SelectDB 版实例在同一地域。

    s3.access_key

    使用S3协议目标的用户身份密钥。

    本文示例为使用阿里云OSS迁移,此处为访问OSSRAM用户的Accesskey ID

    s3.secret_key

    使用S3协议目标的用户加密认证字符串。

    本文示例为使用阿里云OSS迁移,此处为访问OSSRAM用户的AccessKey Secret

    s3.region

    使用S3协议目标的Region。

    本文示例为使用阿里云OSS迁移,此处为阿里云OSS的地域。如何获取,请参见OSS地域和访问域名

    use_path_style

    默认为false

    S3 SDK默认使用Virtual-hosted Style方式。

    但某些对象存储系统可能没开启或没支持Virtual-hosted Style方式的访问,您可以通过添加use_path_style参数来强制使用Path Style方式。

    说明

    URI目前支持三种方案(schema):http://https://s3://

    1. 如果使用http://https://,则会根据use_path_style参数来决定是否使用Path Style方式访问S3协议目标。

    2. 如果使用s3://,则会使用Virtual-hosted Style方式访问S3协议目标。

    示例如下。

    EXPORT TABLE  source_tb  -- 导出source_tb表中的数据
                TO "s3://test-selectdb/test/"  -- 将数据导出至OSS名为test-selectdbbucket中的test文件夹中
                PROPERTIES (
                    "label" = "test_export", -- 任务标签
                    "format" = "orc",   -- 文件存储格式为orc
                    "max_file_size" = '2048MB', -- 文件分割大小
                    'parallelism' = '10'  -- 导出并发数为10
                ) WITH s3 (
                    "s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",  -- 访问OSS bucket的网址
                    "s3.region" = "oss-cn-hangzhou",  -- OSS 所属地域
                    "s3.secret_key"="yourAccessKeySecret",  -- 访问OSSRAM用户的secret key
                    "s3.access_key" = "LTAI****************"  -- -- 访问OSSRAM用户的access key
                );
  5. 验证导出是否成功。

    您可通过以下两种方式,查看数据导出情况。

    • 通过指令查看。

      可在连接了Doris的客户端,执行以下语句,查看导出情况。

      SHOW export;
      • 导出成功:当结果中StateFINISHED时,表示导出数据成功。

      • 导出失败:当结果中StateCANCELLED时,表示导出数据失败。您可通过ErrorMsg中的内容,进一步排查失败的原因。

    • 通过OSS查看。

      登录OSS管理控制台,查看指定导出路径是否有对应文件生成。

步骤二:导入数据至目标表

  1. 登录目标集群。如何登录,请参见通过DMS连接云数据库SelectDB版实例

  2. 创建目标表。

  3. 建库。

    1. (可选)建库。

      如果您已有目标库,可跳过此步骤。

      执行以下语句,创建数据库。

      CREATE DATABASE aim_db;
    2. 建表。

      执行导出数据中备份的建表语句。

      本示例中的建表语句如下。

      CREATE TABLE IF NOT EXISTS aim_tb (
          `c1` int(11) NULL,
          `c2` string NULL,
          `c3` bigint NULL
      ) ENGINE=OLAP
      DUPLICATE KEY(`c1`)
      DISTRIBUTED BY HASH(c1) BUCKETS 20
      PROPERTIES("replication_num" = "1");
  4. 导入数据。

    使用S3 load 导入OSS数据至SelectDB。有关S3 load语法以及更多示例,请参见OSS Load

    示例如下。

     LOAD LABEL label_1  -- labelname 随机取一个,job唯一标识符
                    (
                        DATA INFILE("s3://test-selectdb/test/59ab2e9dc4ec4c04-9e50e45a6fda2c8e_0.orc")  -- 上个步骤中导出数据文件在OSS中的路径
                        INTO TABLE aim_tb  -- 待导入数据的表名
                        FORMAT AS ORC   -- 导入文件的格式,与导出数据时的格式一致
                    )
                    WITH S3
                    (
                        "AWS_PROVIDER" = "OSS",
                        "AWS_REGION" = "oss-cn-hangzhou",  -- OSS bucket 所属地域
                        "AWS_ENDPOINT" = "oss-cn-hangzhou-internal.aliyuncs.com",  -- 访问OSS bucket的网址
                        "AWS_ACCESS_KEY" = "LTAI****************",  -- 访问OSSRAM用户的access key
                        "AWS_SECRET_KEY"="yourAccessKeySecret"  -- 访问OSSRAM用户的secret key
                    )
                    PROPERTIES
                    (
                        "timeout" = "3600"   -- 导入超时时间
                    );
  5. 验证导入结果。

    您可通过以下两种方式,查看导入结果。

    • 通过指令查看。

      可在连接了SelectDB的客户端,执行以下语句,查看导出情况。

      SHOW load;

      导入成功:当结果中StateFINISHED时,表述导出数据成功。

    • 通过查看目标表。示例语句如下。

      SELECT * FROM `aim_tb` limit 10;

      结果如下。

      +--------------+--------------+--------------+
      | c1           | c2           | c3           |
      +--------------+--------------+--------------+
      | 1            | doris        | 18           |
      | 3            | pipelibe     | 99999        |
      | 5            |              |              |
      | 2            | nereids      | 20           |
      | 4            | Apache       | 122123455    |
      +--------------+--------------+--------------+

      步骤一:导出源数据中需要导入的表数据一致,导入成功。

通过Catalog迁移

前提条件

  • 确保Doris实例和SelectDB实例的网络处于互通状态。

  • SelectDB版本不能低于Doris版本。

    说明

    SelectDB是基于Doris构建的云原生实时数仓,二者的版本关系,可参见内核发布记录

  • 了解什么是Catalog,以及Catalog的基本操作。更多详情,请参见湖仓一体

示例环境

本示例将Doris的数据库doris_db中表doris_t的数据迁移到SelectDB 数据库test_db中表test_doris2SelectDB中。在实际使用中,请根据您的实际情况修改对应参数。示例环境如下:

  • 目标库:test_db

  • 目标表:test_doris2SelectDB

  • 源数据库:doris_db

  • 源数据表:doris_t

源数据准备示例

登录您的源数据Doris,进行以下操作。

  1. 创建数据库。

    CREATE DATABASE doris_db;
  2. 创建表。

    CREATE TABLE doris_t
    (
        id int,
        name string,
        age int
    )
    DISTRIBUTED BY HASH(id) BUCKETS 4
    PROPERTIES("replication_num" = "1");
  3. 插入数据。

    INSERT INTO doris_t VALUES
    (1, 'Alice', 25),
    (2, 'Bob', 30),
    (3, 'Charlie', 35),
    (4, 'David', 40),
    (5, 'Eve', 45);

操作步骤

  1. 连接SelectDB实例。具体操作,请参见通过MySQL客户端连接云数据库SelectDB版实例

  2. 创建Doris JDBCCatalog。

    CREATE CATALOG doris_catalog PROPERTIES (
     "type"="jdbc",
     "user"="root",
     "password"="123456",
     "jdbc_url" = "jdbc:mysql://127.0.0.1:9030/doris_db",
     "driver_url" = "mysql-connector-java-8.0.25.jar",
     "driver_class" = "com.mysql.cj.jdbc.Driver"
    )

    参数

    必选

    默认值

    说明

    user

    Doris数据库的账号。

    password

    Doris数据库账号的密码。

    jdbc_url

    JDBC连接串。需要包含Doris数据库的连接地址。

    格式:jdbc:mysql://<host>:<port>/<database>

    • host:Doris数据库的IP地址。

    • port:Doris数据库的端口号。

    • database:需要访问的数据库名称。

    示例:jdbc:mysql://127.0.0.1:9030/doris_db

    driver_url

    JDBC DriverJar包名称。

    说明
    • 推荐使用mysql-connector-java-8.0.25.jar

    • 若希望使用其他Jar包,支持工单咨询。

    driver_class

    JDBC DriverClass名称。

    推荐设置为com.mysql.cj.jdbc.Driver

    lower_case_table_names

    说明

    4.0版本改名为lower_case_meta_names

    "false"

    指定是否以小写的形式同步JDBC外部数据源的库名和表名。

    true:通过维护小写名称到远程系统中实际名称的映射,能够查询非小写的数据库和表。此时,库表列名都会被转换为小写。

    false:不能查询非小写的数据库和表。

    重要
    • 对于SelectDB 3.0版本。

      • 当 FE 参数的lower_case_table_names设置为12时, Catalog 的lower_case_table_names参数必须设置为true

      • 当 FE 参数的lower_case_table_names设置为0,则 Catalog 的参数可以为truefalse

    • 对于SelectDB 4.0版本。

      • 当 FE 的lower_case_table_names参数为02时,库名表名列名都不会被转换。

      • 当 FE 的lower_case_table_names参数为1时,表名会被转换为小写,库名和列名不会被转换。

    only_specified_database

    "false"

    指定是否只同步指定的Database。

    true:只同步 JDBC URL 中指定的数据源的 Database。

    false:同步 JDBC URL 中所有的 Database。

    include_database_list

    ""

    only_specified_database=true时,指定同步多个Database,以英文逗号分隔。Database名称大小写敏感。

    exclude_database_list

    ""

    only_specified_database=true时,指定不需要同步的多个Database,以英文逗号分隔。Database名称大小写敏感。

    meta_names_mapping

    ""

    如果外部数据源存在名称相同只有大小写不同的情况,例如 DORIS 和 doris,Doris 由于歧义而在查询 Catalog 时报错,此时需要配置meta_names_mapping参数来解决冲突。

    具体操作,请参见小写名称同步

    重要

    此参数仅适用于SelectDB4.0版本。

  3. 查看Catalog。

    SHOW CATALOGS; --查看CATALOG是否创建成功

    查询结果如下。

    +--------------+--------------+----------+-----------+-------------------------+---------------------+------------------------+
    | CatalogId    | CatalogName  | Type     | IsCurrent | CreateTime              | LastUpdateTime      | Comment                |
    +--------------+--------------+----------+-----------+-------------------------+---------------------+------------------------+
    | 436009309195 | doris_catalog | jdbc      |           | 2024-08-06 17:09:08.058 | 2024-07-19 18:04:37 |                        |
    |            0 | internal     | internal | yes       | UNRECORDED              | NULL                | Doris internal catalog |
    +--------------+--------------+----------+-----------+-------------------------+---------------------+------------------------+
  4. 可选)切换至External Catalog doris_catalog目录下。

    您可以像使用Internal Catalog一样,对External Catalog doris_catalog的数据进行查看和访问。

    说明

    目前,云数据库 SelectDB 版External Catalog中的数据只支持读操作。

    SWITCH doris_catalog;
  5. 可选)切换内部的catalog internal目录下。

    如果您没有执行第4步,跳过此步骤。

    SWITCH internal;
  6. 可选)创建数据。

    如果您已经创建了目标数据库,可跳过此步骤。

    CREATE database test_db;
  7. 切换至目标数据库。

    USE test_db;
  8. 创建表。

    如果您已经有了目标表,请检查目标列类型与Doris源数据列类型是否一一对应。

    如果您还没有目标表,创建表时,目标列类型需与Doris源数据列类型一一对应。

    列映射详情,请参见类型映射

    CREATE TABLE test_doris2SelectDB
    (
        id int,
        name string,
        age int
    )
    DISTRIBUTED BY HASH(id) BUCKETS 4
    PROPERTIES("replication_num" = "1");
  9. 迁移数据。

    INSERT INTO test_doris2SelectDB SELECT *  FROM doris_catalog.doris_db.doris_t;
  10. 查看数据导入情况。

    SELECT *  FROM test_doris2SelectDB;

增量数据迁移说明

实际生产环境中,Doris数据主要分为离线数据和增量数据。由于Doris数据迁移到SelectDB,通常的使用场景是拷贝一份数据到数据仓库进行查询加速,因此对于增量数据的迁移,可以考虑以下两种方式:

  • 在生产Doris数据时并行写入一份数据到SelectDB

  • 通过周期性作业读取Doris中的分区数据写入SelectDB