将本地表并行导出至OSS引擎

将本地表并行导出至OSS引擎可以极大地提升数据导出效率。本文介绍了将本地表并行导出至OSS引擎的相关内容。

使用限制

  • PolarDB MySQL版集群的产品版本需为企业版并满足以下版本要求:

    • 8.0.1版本:修订版本需达到8.0.1.1.38或更高。

    • 8.0.2版本:修订版本需达到8.0.2.2.25或更高。

  • 仅支持并行导出单表查询的结果。不支持Join、Order By、Group By等多表查询和复杂查询的结果。

  • 建议您在只读节点执行导出任务。您可以在SQL语句中添加HINT语法 /*FORCE_SALVE*/或直接连接只读节点进行导出。

参数说明

参数名称

参数级别

参数说明

loose_oss_outfile_buffer_size

Global

单个oss outfile线程可以占用的内存大小。一般情况下,占用的内存越大,导出速度越快。

取值范围:102400~536870912。默认值为134217728。单位为字节。

使用说明

语法

SELECT * FROM table_name INTO OSSOUTFILE 'outfile_path' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';
说明
  • COLUMNS TERMINATED BY:表示每个字段之间的分隔符。

  • OPTIONALLY ENCLOSED BY:表示字段两端的标识符,加上OPTIONALLY后,只会在字符串类型的字段两端加标识符,否则会在所有类型的字段两端加标识符。

  • NULL_MARKER BY:表示NULL值输出到文本的字符。NULL的输出值有如下三种定义方式,优先级从高到低:

    • NULL_MARKER:直接定义NULL的输出值,NULL_MARKER可以定义为任意值,优先级最高。

    • ESCAPED BY:只能写单字符,NULL的输出值为字符+N。例如,ESCAPED BY '\',则NULL会被输出为\N,优先级第二。

    • NULL(默认):如果以上两者都没有,则默认NULL的输出值为字符串“NULL”,优先级最低。NULL的两端没有ENCLOSED标识符。

  • LINES TERMINATED BY:每一行之间的分隔符。

详情请参见MySQL官方文档

参数说明

参数

说明

outfile_path

主要标识输出到OSS的文件位置,包含如下几部分内容:

  • OSS server信息,用来标识当前使用的OSS节点和上传的基本路径。详情请参见通过OSS外表访问OSS数据

  • (可选)当前任务单独的路径

  • 上传后的文件名。

上述三者之间用/连接。当前任务单独的路径中可以包含多个/,表示使用多级路径。上传到OSS引擎后,其整体的文件路径为:OSS server中的路径+单独的路径。outfile_path中必须包含上传后的文件名,用来说明最后生成的文件名。

table_name

表名称。

示例

您可以选择在SQL语句前添加HINT语法来并行导出数据。或开启弹性并行查询功能后,直接执行SQL语句来导出数据。开启并行查询功能的具体操作请参见概述

此处以在SQL语句SELECT * FROM lineitem;中添加HINT为例,介绍如何将本地表并行导出至OSS引擎。

  1. 执行以下命令,查看当前SQL语句是否可以并行执行。

    EXPLAIN SELECT /*+parallel(4)*/ * FROM lineitem;

    执行结果如下:

    +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------+
    | id | select_type | table     | partitions | type | possible_keys | key  | key_len | ref  | rows    | filtered | Extra                     |
    +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------+
    |  1 | SIMPLE      | <gather1> | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 5392844 |   100.00 | NULL                      |
    |  1 | SIMPLE      | lineitem  | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 1348211 |   100.00 | Parallel scan (4 workers) |
    +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------+
    2 rows in set, 1 warning (0.05 sec)
    

    Extra列有Parallel scan,则表示当前SQL语句可以并行执行。

  2. 创建导出的OSS Server,此处以创建outserver为例。

    CREATE SERVER outserver FOREIGN DATA WRAPPER oss OPTIONS ( EXTRA_SERVER_INFO '{"oss_endpoint": "oss-cn-zhangjiakou.aliyuncs.com", "oss_bucket": "polardb", "oss_access_key_id": "*******", "oss_access_key_secret": "********", "oss_prefix":"B_outfile"}');
  3. 执行以下命令,查看并行导出的SQL语句的执行计划,以确定是否能将本地表并行导出至OSS引擎。

    EXPLAIN SELECT /*+parallel(4)*/ * FROM lineitem INTO OSSOUTFILE 'outserver/t1.CSV' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';

    执行计划如下:

    +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+--------------------------------------------------------+
    | id | select_type | table     | partitions | type | possible_keys | key  | key_len | ref  | rows    | filtered | Extra                                                  |
    +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+--------------------------------------------------------+
    |  1 | SIMPLE      | <gather1> | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 5805759 |   100.00 | Parallel export OSS outfile                            |
    |  1 | SIMPLE      | lineitem  | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 1451439 |   100.00 | Parallel scan (4 workers); Parallel export OSS outfile |
    +----+-------------+-----------+------------+------+---------------+------+---------+------+---------+----------+--------------------------------------------------------+
    2 rows in set, 1 warning (0.03 sec)
    • 若执行计划的Extra列中有Parallel export OSS outfile,则表示可以将本地表并行导出至OSS引擎。

    • 若执行计划中不支持并行导出。您可以通过以下方法查看原因:

      1. OPTIMIZER_TRACE参数设置为ON

        SET optimizer_trace="enabled=on";
      2. 执行以下命令,查看并行导出的SQL语句的执行计划。

        EXPLAIN SELECT /*+parallel(4)*/ * FROM lineitem WHERE l_orderkey < 100 INTO OSSOUTFILE 'default_oss_server/t1' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';

        执行结果如下:

        +----+-------------+-----------+------------+-------+----------------------+---------+---------+------+------+----------+----------------------------------------+
        | id | select_type | table     | partitions | type  | possible_keys        | key     | key_len | ref  | rows | filtered | Extra                                  |
        +----+-------------+-----------+------------+-------+----------------------+---------+---------+------+------+----------+----------------------------------------+
        |  1 | SIMPLE      | <gather1> | NULL       | ALL   | NULL                 | NULL    | NULL    | NULL |  105 |   100.00 | NULL                                   |
        |  1 | SIMPLE      | lineitem  | NULL       | range | PRIMARY,i_l_orderkey | PRIMARY | 4       | NULL |   26 |   100.00 | Parallel scan (4 workers); Using where |
        +----+-------------+-----------+------------+-------+----------------------+---------+---------+------+------+----------+----------------------------------------+
        2 rows in set, 1 warning (0.00 sec)
      3. 执行以下命令,查看并行导出的SQL语句的Optimizer Trace。

        SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;

        执行结果如下:

        ```
         "considered_parallel_outfile": {
                              "choose": false,
                              "storage": "OSS",
                              "format": "CSV",
                              "mean_outfile_record_length": "79 B",
                              "estimate_single_worker_outfile_size": "8 KB",
                              "cause": "The data written by each worker should be greater than 1024 KB (pq_oss_min_worker_write_size)."
                            }
                          }
        ```

        您可以在执行结果的cause参数值中查看不能并行导出的原因。

  4. 执行以下命令,将本地表并行导出至OSS引擎。

    SELECT /*+parallel(4)*/ * FROM lineitem INTO OSSOUTFILE 'outserver/t1.CSV' COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' NULL_MARKER BY 'NULL' LINES TERMINATED BY '\n';

    导出过程中,您可以通过以下命令查看当前导出任务实时占用的总内存数和总线程数。

    • 查看导出任务实时占用的总内存数,单位为字节。

      SHOW STATUS LIKE "%Oss_outfile_memory_used%";
    • 查看导出任务实时占用的总线程数。

      SHOW STATUS LIKE "%Oss_outfile_threads_running%";
    说明

    当您连接集群地址执行导出任务时,必须保证SHOW STATUS命令和导出命令在同一个节点执行,才能查询当前节点中导出命令占用的内存资源信息。